Как мне программно добавить кнопку в gridview и назначить ее определенной кодовой функции?
Вопрос
Во время выполнения я создаю DataTable и использую вложенные циклы for для заполнения таблицы.Эту таблицу я позже назначаю в качестве источника данных для gridview, а в RowDataBound присваиваю значение каждой ячейке.Я хочу знать, как я могу присвоить каждой ячейке кнопку и назначить эту кнопку функции codebehind.У меня будет 12 кнопок, и каждая из них будет содержать свое значение.Я бы предпочел, чтобы все они вызывали одну и ту же функцию с каким-нибудь событием, которое сохраняет значение, зависящее от конкретной ячейки.
Это код, в котором создается таблица:
protected void GridViewDice_RowDataBound(object sender, GridViewRowEventArgs e)
{
DataTable diceTable = _gm.GetDice(_gameId);
for (int i = 0; i < GameRules.ColumnsOfDice; i++)
{
if(e.Row.RowIndex > -1)
{
/*This is where I'd like to add the button*/
//e.Row.Cells[i].Controls.Add(new Button);
//e.Row.Cells[i].Controls[0].Text = specific value from below
//This is where the specific value gets input
e.Row.Cells[i].Text = diceTable.Rows[e.Row.RowIndex][i].ToString();
}
}
}
Я хотел бы обработать нажатие кнопки чем-то вроде этого:
protected void DiceButton_Click(int column, int row, int value)
{
//Do whatever
}
Есть какие-нибудь предложения?
Решение
В вашем gridview в markup назначьте атрибут CommandArgument тому, что вы хотите (здесь я выбираю индекс текущего gridviewrow) внутри ваших кнопок.
<asp:Button ID="lbnView" runat="server" Text="Button" OnClick="btn_Clicked"
CommandArgument="<%# ((GridViewRow)Container).RowIndex %>"></asp:Button>
Или в своем коде вы можете создать кнопку, подобную приведенной ниже
protected void GridViewDice_RowDataBound(object sender, GridViewRowEventArgs e)
{
DataTable diceTable = _gm.GetDice(_gameId);
for (int i = 0; i < GameRules.ColumnsOfDice; i++)
{
if(e.Row.RowIndex > -1)
{
Button btn = new Button();
btn.CommandArgument = diceTable.Rows[e.Row.RowIndex][i].ToString();
btn.Attributes.Add("OnClick", "btn_Clicked");
e.Row.Cells[i].Controls.Add(btn);
}
}
}
затем создайте обработчик событий, как показано ниже
protected void btn_Clicked(object sender, EventAgrs e)
{
//get your command argument from the button here
if (sender is Button)
{
try
{
String yourAssignedValue = ((Button)sender).CommandArgument;
}
catch
{
//Check for exception
}
}
}
Другие советы
К сожалению, на этом этапе вы не можете создать новую кнопку и назначить ей события.К этому моменту жизненного цикла страницы, когда она запускает события, она уже создала список "известных" элементов управления, которые она будет отслеживать при перезагрузке страницы, и поэтому она не будет знать, что нужно запускать код события нажатия кнопки при следующей публикации.
Чтобы получить ASP.NET для правильного запуска ваших методов событий, вам необходимо добавить элемент управления Button в иерархию элементов управления страницы перед событием загрузки страницы.Обычно я делаю это в событии Init или методе CreateChildControls.
Чтобы решить вашу проблему, я бы рекомендовал добавить кнопку во все ячейки разметки шаблона и сделать так, чтобы она ссылалась там на обработчик событий.Затем попросите ваш дескриптор метода RowDataBound включить или выключить видимость кнопки.
Самый простой способ сделать это - просто добавить столбец в свой GridView (вы можете использовать кнопку, а не гиперссылку, если хотите).:
<Columns>
<asp:HyperLinkField DataNavigateUrlFields="ID" DataNavigateUrlFormatString="~/pUser.aspx?field={0}" HeaderText="Select" Text="Select" />