Странное поведение события ASP.NET DataGrid ItemCommand

Я использую DataGrid только программно.

 Public Class MyOwnDataGrid
    Inherits MyBaseClass

    Private DataControl As New WebControls.DataGrid
    Public Property DataSource as DataTable = Nothing

    Public Sub New()
        AddHandler Me.DataControl.ItemCommand, AddressOf Me.DataGrid_ItemCommand
        Me.DataControl.AutoGenerateColumns = False
    End Sub
 End Class

На Page_Load Я связываю DataSource и добавьте столбцы.

Protected Overrides Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
  'I have to hold the DataSource in a Session variable because after PostBack is the DataSource property nothing
  If (Not (Me.DataSource Is Nothing) And Not (Me.IsPostBack)) Then Session("DataSource") = Me.DataSource

  If (Not (Session(Me.DataSourceSessionName) Is Nothing)) Then
    Me.DataControl.DataSource = Session("DataSource")
    Me.DataControl.DataSource.AcceptChanges()
  End If

  'add the columns with content

  'add the columns for Actions

  Dim oColumn As New TemplateColumn
  oColumn.ItemTemplate = New ActionColumn With {.Control = New WebControls.ImageButton With {.SkinID = "Edit", .ToolTip = "Edit", .CommandName = "Edit"}}
  oColumn.EditItemTemplate = New ActionColumn With {.Control = New WebControls.ImageButton With {.SkinID = "Update", .ToolTip = "Apply", .CommandName = "Update"}}
  oColumn.FooterTemplate = New ActionColumn With {.Control = New WebControls.ImageButton With {.SkinID = "Insert", .ToolTip = "Add", .CommandName = "Insert"}}
  Me.DataControl.Columns.Add(oColumn)

  oColumn = New TemplateColumn
  oColumn.ItemTemplate = New ActionColumn With {.Control = New WebControls.ImageButton With {.SkinID = "Delete", .ToolTip = "Delete", .CommandName = "Delete"}}
  oColumn.EditItemTemplate = New ActionColumn With {.Control = New WebControls.ImageButton With {.SkinID = "Cancel", .ToolTip = "Cancel", .CommandName = "Cancel"}}
  Me.DataControl.Columns.Add(oColumn)

  'Bind the DataSource at every PostBack because otherwise the DataSource is empty and the control will be hidden

  Me.DataControl.DataBind()
End Sub

Private Class ActionColumn
  Implements System.Web.UI.ITemplate

  Public Property Control As WebControls.ImageButton = Nothing

  Public Sub InstantiateIn(ByVal container As System.Web.UI.Control) Implements System.Web.UI.ITemplate.InstantiateIn
    If (Not (Me.Control Is Nothing)) Then container.Controls.Add(Me.Control.Clone)
  End Sub
End Class

Моя проблема в том, что ItemCommand Событие работает случайным образом.

Private Sub DataGrid_ItemCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs)
  Select Case e.CommandName.ToUpper
    Case "Edit".ToUpper 
      'do something
    Case "Cancel".ToUpper 
      'do something
    Case "Update".ToUpper 
      'do something
    Case "Delete".ToUpper 
      'do something
    Case Else
  End Select
End Sub

Если я нажимаю кнопку Изменить или Удалить, он работает нормально. С помощью кнопки "Редактировать" в режиме редактирования устанавливается одна строка, и если я нажимаю на кнопку, происходит странное поведение. Доступны обе кнопки "Применить" и "Отмена". Если я нажму их на кнопку Применить, будет использована кнопка Удалить, а если я нажму кнопку Отмена, ItemCommand событие не запускается, но строка больше не находится в режиме редактирования.

Где моя ошибка? Что я не так, что это не работает правильно? Если бы я создал столбцы в разметке, все работает нормально. Но не в моем случае со всеми на стороне сервера.

Спасибо за любой ответ.

1 ответ

Я могу тебе позвонить bindGrid() метод после проверки page.ispostback на page_load как это:

protected void Page_Load(object sender, EventArgs e)
    {
        if (Page.IsPostBack)
        {
            return;
        }
       BindGrid();
    }

проверьте этот пост.

Другие вопросы по тегам