2008-09-24 2 views
2

В ASP.NET, если я привязываю gridview с массивом объектов, скажем, как я могу получить и использовать foo (index), когда пользователь выбирает строку?GridView Row для типа объекта

т.е.

dim fooArr() as foo; 
gv1.datasource = fooArr; 
gv1.databind(); 

по строке Select

Private Sub gv1_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs) Handles gv1.RowCommand 

     If e.CommandName = "Select" Then 
      'get and use foo(index)  
     End If 
    End Sub 

ответ

2

Если вы можете быть уверены, что порядок элементов в вашем источнике данных не изменился, вы можете использовать свойство CommandArgument для CommandEventArgs.

Более надежный метод, однако, заключается в использовании свойств DataKeys/SelectedDataKey GridView. Единственное предостережение в том, что ваша команда должна иметь тип «Выбрать» (поэтому по умолчанию у RowCommand не будет доступа к DataKey).

Предполагая, что у вас есть уникальность в сущностях, входящих в ваш список, вы можете установить одно или несколько имен свойств ключа в свойстве DataKeys GridView. Когда выбранный элемент в GridView установлен, вы можете получить свои ключевые значения и найти элемент в сводном списке. Этот метод избавляет вас от проблемы наличия порядкового положения в GridView, не соответствующего порядковой позиции вашего элемента в источнике данных.

Пример:

<asp:GridView ID="GridView1" runat="server" AutoGenerateSelectButton="True" 
    DataKeyNames="Name" onrowcommand="GridView1_RowCommand1" 
    onselectedindexchanged="GridView1_SelectedIndexChanged"> 
</asp:GridView> 

Затем код-за (или рядный) для страницы будет что-то вроде:

protected void GridView1_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    // Value is the Name property of the selected row's bound object. 
    string foo = GridView1.SelectedDataKey.Value as string; 
} 

Другой выбор должен был бы идти спелеология в коллекции Rows из GridView, получая значения столбца за раз, получая контрольные значения, но это не рекомендуется, если только вам не нужно.

Надеюсь, это поможет.

0

в теории индекс строки, должен быть индекс обув (возможно +1 для строки заголовка, вам нужно проверить). таким образом, вы должны быть в состоянии сделать что-то вдоль этих линий

dim x as object = foo(e.row.selectedIndex) 

Другой альтернативой является найти способ DataBind индекс для атрибута CommandArgument кнопки.

0

Возможно, это более чистый способ сделать это, но вы можете установить для свойства CommandArgument строки свой индекс. Тогда что-то вроде foo(CInt(e.CommandArgument)) сделало бы трюк.