Получить значения DataKey в GridView RowCommand

У меня есть GridView с ассоциированным DataKey , который является идентификатором элемента. Как получить это значение внутри события RowCommand ?

Кажется, это работает, но мне не нравится приведение к LinkButton (что, если какая-то другая команда LinkButton событие?), И я не слишком уверен в бит NamingContainer .

 LinkButton lb = (LinkButton)e.CommandSource; GridViewRow gvr = (GridViewRow)lb.NamingContainer; int id = (int)grid.DataKeys[gvr.RowIndex].Value; 

Я знаю, что вместо этого я мог бы передать этот ID как CommandArgument , но я решил использовать DataKey чтобы дать мне больше гибкости.

Я также знаю, что для ID можно использовать скрытое поле, но я считаю, что это взломать, который я не хочу использовать.

Я обычно передаю RowIndex через CommandArgument и использую его для получения значения DataKey, которое я хочу.

На кнопке:

 CommandArgument='<%# DataBinder.Eval(Container, "RowIndex") %>' 

На сервере событий

 int rowIndex = int.Parse(e.CommandArgument.ToString()); string val = (string)this.grid.DataKeys[rowIndex]["myKey"]; 

Мне удалось получить значение DataKeys с помощью этого кода:

В GridView я добавил:

 DataKeyNames="ID" OnRowCommand="myRowCommand" 

Затем в моей командной строке:

 protected void myRowCommand(object sender, GridViewCommandEventArgs e) { LinkButton lnkBtn = (LinkButton)e.CommandSource; // the button GridViewRow myRow = (GridViewRow)lnkBtn.Parent.Parent; // the row GridView myGrid = (GridView)sender; // the gridview string ID = myGrid.DataKeys[myRow.RowIndex].Value.ToString(); // value of the datakey switch (e.CommandName) { case "cmd1": // do something using the ID break; case "cmd2": // do something else using the ID break; } } 
 foreach (GridViewRow gvr in gvMyGridView.Rows) { string PrimaryKey = gvMyGridView.DataKeys[gvr.RowIndex].Values[0].ToString(); } 

Вы можете использовать этот код, выполняя итерацию с foreach или для любого события GridView, такого как OnRowDataBound .

Здесь вы можете ввести несколько значений для DataKeyNames , разделив их запятой. Например, DataKeyNames="ProductID,ItemID,OrderID" .

Теперь вы можете получить доступ к каждому из DataKeys его индекс, как DataKeys ниже:

 string ProductID = gvMyGridView.DataKeys[gvr.RowIndex].Values[0].ToString(); string ItemID = gvMyGridView.DataKeys[gvr.RowIndex].Values[1].ToString(); string OrderID = gvMyGridView.DataKeys[gvr.RowIndex].Values[2].ToString(); 

Вы также можете использовать Key Name вместо своего индекса, чтобы получить значения из коллекции DataKeyNames как DataKeyNames ниже:

 string ProductID = gvMyGridView.DataKeys[gvr.RowIndex].Values["ProductID"].ToString(); string ItemID = gvMyGridView.DataKeys[gvr.RowIndex].Values["ItemID"].ToString(); string OrderID = gvMyGridView.DataKeys[gvr.RowIndex].Values["OrderID"].ToString(); 

вы можете просто сделать это:

 string id = GridName.DataKeys[Convert.ToInt32(e.CommandArgument)].Value.ToString(); 

На кнопке:

 CommandArgument='<%# Eval("myKey")%>' 

На сервере событий

 e.CommandArgument 
  • Разница между e.target и e.currentTarget
  • Мне нужно событие для обнаружения подключения к Интернету / отключения
  • Порядок событий «Form.Load», «Form.Shown» и «Form.Activated» в Windows Forms
  • Использование IDisposable для отмены подписки
  • BackgroundWorker RunWorkerCompleted Event
  • + = new EventHandler (метод) vs + = Метод
  • Что означает «Захват мыши» в WPF?
  • Подписка на динамические события C #
  • В обработчике событий C # почему параметр «отправитель» должен быть объектом?
  • Использование lambda-выражений для обработчиков событий
  • Пользовательский прослушиватель событий в приложении для Android
  • Давайте будем гением компьютера.