W
wannensn
Hello,
I need to create a DataGrid at runtime with a EditCommandColumn. Everything
works fine only the events of the EditCommandColumn, which are not firing
correctly. If I click on "Edit" the right Event-Handler is used but when I
click on "Update" or "Cancel" the Event-Handler for the EditCommand is
used;-(
For testing I override the "RaisePostBackEvent" of the WebForm: I found out
that the source of the Event
is a System.Web.UI.WebControls.DataGridLinkButton. In every case the command
name
of the LinkButton is "Edit", if I change this manually to "Update" or
"Cancel" everything works
fine. So what could be the problem?!?!
I read several articles and posts about this, but I never found a solution
that is working.
I hope someone can help me.
Thanks,
Stephan
Here is my code:
Public Class WebForm1
Inherits System.Web.UI.Page
#Region " Vom Web Form Designer generierter Code "
'Dieser Aufruf ist für den Web Form-Designer erforderlich.
<System.Diagnostics.DebuggerStepThrough()> Private Sub
InitializeComponent()
End Sub
'HINWEIS: Die folgende Platzhalterdeklaration ist für den Web
Form-Designer erforderlich.
'Nicht löschen oder verschieben.
Private designerPlaceholderDeclaration As System.Object
Private Sub Page_Init(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Init
'CODEGEN: Dieser Methodenaufruf ist für den Web Form-Designer
erforderlich
'Verwenden Sie nicht den Code-Editor zur Bearbeitung.
InitializeComponent()
End Sub
#End Region
Dim mGrid As DataGrid
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
CreateGrid()
End Sub
Public Sub CreateGrid()
'declare a new datagrid and set properties
mGrid = New DataGrid
mGrid.ID = "234"
mGrid.BorderWidth = Unit.Pixel(2)
mGrid.CellPadding = 10
mGrid.GridLines = GridLines.Both
mGrid.BorderColor = Color.Blue
mGrid.ShowHeader = True
mGrid.AutoGenerateColumns = False
mGrid.SelectedItemStyle.BackColor = Color.Yellow
'add bound columns to the datagrid
Dim datagridcol As New BoundColumn
datagridcol.HeaderText = "Column1"
datagridcol.DataField = "Column1"
mGrid.Columns.Add(datagridcol)
datagridcol = New BoundColumn
datagridcol.HeaderText = "Column2"
datagridcol.DataField = "Column2"
mGrid.Columns.Add(datagridcol)
Dim editCol As New EditCommandColumn
editCol.ButtonType = ButtonColumnType.LinkButton
editCol.EditText = "Edit"
editCol.UpdateText = "Update"
editCol.CancelText = "Cancel"
mGrid.Columns.Add(editCol)
AddHandler mGrid.UpdateCommand, AddressOf DataGrid1_UpdateCommand
AddHandler mGrid.CancelCommand, AddressOf DataGrid1_CancelCommand
AddHandler mGrid.EditCommand, AddressOf DataGrid1_EditCommand
''bind datagrid
mGrid.DataSource = GetDataSet()
mGrid.DataBind()
'add datagrid to the page
Page.Controls(1).Controls.Add(mGrid)
End Sub
Public Function GetDataSet() As DataTable
Dim dTable As Data.DataTable = Session.Item("DataTable")
If dTable Is Nothing Then
dTable = New Data.DataTable
Dim dCol1 As New Data.DataColumn("Column1")
Dim dCol2 As New Data.DataColumn("Column2")
dTable.Columns.Add(dCol1)
dTable.Columns.Add(dCol2)
Dim dRow As Data.DataRow = dTable.NewRow
dRow.Item("Column1") = "Value1.1"
dRow.Item("Column2") = "Value1.2"
dTable.Rows.Add(dRow)
dRow = dTable.NewRow
dRow.Item("Column1") = "Value2.1"
dRow.Item("Column2") = "Value2.2"
dTable.Rows.Add(dRow)
Session.Add("DataTable", dTable)
End If
Return dTable
End Function
Private Sub DataGrid1_UpdateCommand(ByVal source As Object, ByVal e As
System.Web.UI.WebControls.DataGridCommandEventArgs)
Dim tmpGrid As DataGrid = CType(source, DataGrid)
tmpGrid.EditItemIndex = -1
'bind datagrid
tmpGrid.DataSource = GetDataSet()
tmpGrid.DataBind()
End Sub
Private Sub DataGrid1_CancelCommand(ByVal source As Object, ByVal e As
System.Web.UI.WebControls.DataGridCommandEventArgs)
Dim tmpGrid As DataGrid = CType(source, DataGrid)
tmpGrid.EditItemIndex = -1
'bind datagrid
tmpGrid.DataSource = GetDataSet()
tmpGrid.DataBind()
End Sub
Private Sub DataGrid1_EditCommand(ByVal source As Object, ByVal e As
System.Web.UI.WebControls.DataGridCommandEventArgs)
Dim tmpGrid As DataGrid = CType(source, DataGrid)
tmpGrid.EditItemIndex = CInt(e.Item.ItemIndex)
'bind datagrid
tmpGrid.DataSource = GetDataSet()
tmpGrid.DataBind()
End Sub
Protected Overloads Overrides Sub RaisePostBackEvent(ByVal sourceControl As
System.Web.UI.IPostBackEventHandler, ByVal eventArgument As String)
CType(sourceControl, System.Web.UI.WebControls.LinkButton).CommandName =
"Update"
sourceControl.RaisePostBackEvent(eventArgument)
End Sub
End Class
I need to create a DataGrid at runtime with a EditCommandColumn. Everything
works fine only the events of the EditCommandColumn, which are not firing
correctly. If I click on "Edit" the right Event-Handler is used but when I
click on "Update" or "Cancel" the Event-Handler for the EditCommand is
used;-(
For testing I override the "RaisePostBackEvent" of the WebForm: I found out
that the source of the Event
is a System.Web.UI.WebControls.DataGridLinkButton. In every case the command
name
of the LinkButton is "Edit", if I change this manually to "Update" or
"Cancel" everything works
fine. So what could be the problem?!?!
I read several articles and posts about this, but I never found a solution
that is working.
I hope someone can help me.
Thanks,
Stephan
Here is my code:
Public Class WebForm1
Inherits System.Web.UI.Page
#Region " Vom Web Form Designer generierter Code "
'Dieser Aufruf ist für den Web Form-Designer erforderlich.
<System.Diagnostics.DebuggerStepThrough()> Private Sub
InitializeComponent()
End Sub
'HINWEIS: Die folgende Platzhalterdeklaration ist für den Web
Form-Designer erforderlich.
'Nicht löschen oder verschieben.
Private designerPlaceholderDeclaration As System.Object
Private Sub Page_Init(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Init
'CODEGEN: Dieser Methodenaufruf ist für den Web Form-Designer
erforderlich
'Verwenden Sie nicht den Code-Editor zur Bearbeitung.
InitializeComponent()
End Sub
#End Region
Dim mGrid As DataGrid
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
CreateGrid()
End Sub
Public Sub CreateGrid()
'declare a new datagrid and set properties
mGrid = New DataGrid
mGrid.ID = "234"
mGrid.BorderWidth = Unit.Pixel(2)
mGrid.CellPadding = 10
mGrid.GridLines = GridLines.Both
mGrid.BorderColor = Color.Blue
mGrid.ShowHeader = True
mGrid.AutoGenerateColumns = False
mGrid.SelectedItemStyle.BackColor = Color.Yellow
'add bound columns to the datagrid
Dim datagridcol As New BoundColumn
datagridcol.HeaderText = "Column1"
datagridcol.DataField = "Column1"
mGrid.Columns.Add(datagridcol)
datagridcol = New BoundColumn
datagridcol.HeaderText = "Column2"
datagridcol.DataField = "Column2"
mGrid.Columns.Add(datagridcol)
Dim editCol As New EditCommandColumn
editCol.ButtonType = ButtonColumnType.LinkButton
editCol.EditText = "Edit"
editCol.UpdateText = "Update"
editCol.CancelText = "Cancel"
mGrid.Columns.Add(editCol)
AddHandler mGrid.UpdateCommand, AddressOf DataGrid1_UpdateCommand
AddHandler mGrid.CancelCommand, AddressOf DataGrid1_CancelCommand
AddHandler mGrid.EditCommand, AddressOf DataGrid1_EditCommand
''bind datagrid
mGrid.DataSource = GetDataSet()
mGrid.DataBind()
'add datagrid to the page
Page.Controls(1).Controls.Add(mGrid)
End Sub
Public Function GetDataSet() As DataTable
Dim dTable As Data.DataTable = Session.Item("DataTable")
If dTable Is Nothing Then
dTable = New Data.DataTable
Dim dCol1 As New Data.DataColumn("Column1")
Dim dCol2 As New Data.DataColumn("Column2")
dTable.Columns.Add(dCol1)
dTable.Columns.Add(dCol2)
Dim dRow As Data.DataRow = dTable.NewRow
dRow.Item("Column1") = "Value1.1"
dRow.Item("Column2") = "Value1.2"
dTable.Rows.Add(dRow)
dRow = dTable.NewRow
dRow.Item("Column1") = "Value2.1"
dRow.Item("Column2") = "Value2.2"
dTable.Rows.Add(dRow)
Session.Add("DataTable", dTable)
End If
Return dTable
End Function
Private Sub DataGrid1_UpdateCommand(ByVal source As Object, ByVal e As
System.Web.UI.WebControls.DataGridCommandEventArgs)
Dim tmpGrid As DataGrid = CType(source, DataGrid)
tmpGrid.EditItemIndex = -1
'bind datagrid
tmpGrid.DataSource = GetDataSet()
tmpGrid.DataBind()
End Sub
Private Sub DataGrid1_CancelCommand(ByVal source As Object, ByVal e As
System.Web.UI.WebControls.DataGridCommandEventArgs)
Dim tmpGrid As DataGrid = CType(source, DataGrid)
tmpGrid.EditItemIndex = -1
'bind datagrid
tmpGrid.DataSource = GetDataSet()
tmpGrid.DataBind()
End Sub
Private Sub DataGrid1_EditCommand(ByVal source As Object, ByVal e As
System.Web.UI.WebControls.DataGridCommandEventArgs)
Dim tmpGrid As DataGrid = CType(source, DataGrid)
tmpGrid.EditItemIndex = CInt(e.Item.ItemIndex)
'bind datagrid
tmpGrid.DataSource = GetDataSet()
tmpGrid.DataBind()
End Sub
Protected Overloads Overrides Sub RaisePostBackEvent(ByVal sourceControl As
System.Web.UI.IPostBackEventHandler, ByVal eventArgument As String)
CType(sourceControl, System.Web.UI.WebControls.LinkButton).CommandName =
"Update"
sourceControl.RaisePostBackEvent(eventArgument)
End Sub
End Class