Получить значения DataKey в GridView RowCommand
У меня есть 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
, чтобы дать мне больше гибкости.
Я также знаю, что можно использовать скрытое поле для ID, но я считаю, что это взломать, который я не хочу использовать.
Ответы
Ответ 1
Я обычно передаю RowIndex через CommandArgument и использую его для получения значения DataKey, которое я хочу.
На кнопке:
CommandArgument='<%# DataBinder.Eval(Container, "RowIndex") %>'
В событии сервера
int rowIndex = int.Parse(e.CommandArgument.ToString());
string val = (string)this.grid.DataKeys[rowIndex]["myKey"];
Ответ 2
Мне удалось получить значение 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;
}
}
Ответ 3
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();
Вы также можете использовать Key Name вместо своего индекса, чтобы получить значения из коллекции 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();
Ответ 4
вы можете просто сделать это:
string id = GridName.DataKeys[Convert.ToInt32(e.CommandArgument)].Value.ToString();
Ответ 5
На кнопке:
CommandArgument='<%# Eval("myKey")%>'
В событии сервера
e.CommandArgument