Получить значения DataKey в GridView RowCommand - PullRequest
50 голосов
/ 12 мая 2010

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

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

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

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

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

Ответы [ 5 ]

89 голосов
/ 12 мая 2010

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

На кнопке:

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

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

int rowIndex = int.Parse(e.CommandArgument.ToString());
string val = (string)this.grid.DataKeys[rowIndex]["myKey"];
29 голосов
/ 13 июля 2011

Мне удалось получить значение 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;
    }
 }
10 голосов
/ 14 октября 2014
foreach (GridViewRow gvr in gvMyGridView.Rows)
{
    string PrimaryKey = gvMyGridView.DataKeys[gvr.RowIndex].Values[0].ToString();
}

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

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

Теперь вы можете получить доступ к каждому из 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();

Вы также можете использовать Имя ключа вместо его индекса, чтобы получить значения из коллекции 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();
5 голосов
/ 08 августа 2012

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

string id = GridName.DataKeys[Convert.ToInt32(e.CommandArgument)].Value.ToString();
2 голосов
/ 22 июля 2015

На кнопке:

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

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

e.CommandArgument
...