Получить значения 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
чтобы дать мне больше гибкости.
- Суперпростой пример наблюдателя C # / наблюдаемого с делегатами
- Событие jquery live для добавления элементов dom
- Неактивность и активность WPF
- Отслеживание положения прокрутки и уведомление об этом других компонентах
- Как я могу вызвать событие рисования?
Я также знаю, что для ID можно использовать скрытое поле, но я считаю, что это взломать, который я не хочу использовать.
- Как создать 5 кнопок и назначить отдельные события кликов динамически?
- Должен ли я всегда отключать обработчики событий в методе Dispose?
- Как удалить все обработчики событий из события
- Каковы различия между делегатами и событиями?
- Остановить распространение событий мыши в угловом
- Как я могу создать событие в usercontrol и поймать его на главной странице?
- Событие Internet Explorer и JavaScript currentTarget
- Событие Click не работает с динамически сгенерированными элементами
Я обычно передаю 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