Получить значения 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 
  • Что такое WPF Preview Events?
  • Как я могу сделать свое собственное событие на C #?
  • Как создать 5 кнопок и назначить отдельные события кликов динамически?
  • Понимание событий и обработчиков событий в C #
  • Остановить распространение событий мыши в угловом
  • Как распознать события касания, используя jQuery в Safari для iPad? Является ли это возможным?
  • Подпись к событию в .NET. Использование сильного напечатанного «Отправителя»?
  • Как проверить, нажата ли клавиша во время события click с помощью jQuery?
  • Как обеспечить, чтобы событие было подписано только один раз
  • Как захватить щелчок мышью по элементу в ListBox в WPF?
  • Событие Click не работает с динамически сгенерированными элементами
  • Давайте будем гением компьютера.