Как программно добавить кнопку в вид сетки и назначить ее определенной функции кода программной части?

Во время выполнения я создаю DataTable и использую вложенные циклы for для заполнения таблицы. Позже я назначаю эту таблицу как DataSource для gridview, а в RowDataBound я назначаю значение каждой ячейки. Я хочу знать, как я могу дать каждой ячейке кнопку и назначить эту кнопку функции кода программной части. У меня будет 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
}

Какие-либо предложения?


person Phil    schedule 10.03.2010    source источник


Ответы (3)


В вашем gridview в разметке назначьте атрибут 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
     }
   }
}
person madatanic    schedule 10.03.2010
comment
Спасибо, я попробую это немедленно. Но разве это не то, что не сработает, если верить другому сообщению Майка Муни? - person Phil; 11.03.2010
comment
Кнопки появились, но событие, кажется, не запускается... это из-за причины, указанной ниже? - person Phil; 11.03.2010
comment
Вместо btn.Attributes.Add(OnClick, btn_Clicked); ПОПРОБУЙТЕ btn.Click += новый обработчик событий (btn_Clicked); - person madatanic; 11.03.2010

К сожалению, на этом этапе вы не можете создать новую кнопку и назначить ей события. К этому моменту жизненного цикла страницы, когда он запускает события, он уже создал список «известных» элементов управления, которые он будет отслеживать при перезагрузке страницы, и поэтому он не будет знать, чтобы запустить код события нажатия кнопки. в следующий раз, когда он отправляет обратно.

Чтобы заставить ASP.NET правильно запускать ваши методы событий, вам нужно добавить элемент управления Button в иерархию элементов управления страницы перед событием Load страницы. Обычно я делаю это в событии Init или в методе CreateChildControls.

Чтобы решить вашу проблему, я бы рекомендовал добавить кнопку во все ячейки в разметке шаблона и указать там ссылку на обработчик событий. Затем сделайте так, чтобы дескриптор метода RowDataBound включал или выключал видимость кнопки.

person Mike Mooney    schedule 10.03.2010
comment
Итак, в основном в Page_Init я создаю DataTable Templeate, который я заполняю кнопками? Я не уверен, что следую. Спасибо за ответ! - person Phil; 11.03.2010

Самый простой способ сделать это — просто добавить столбец в свой GridView (вы можете использовать кнопку, а не гиперссылку, если хотите):

<Columns>
 <asp:HyperLinkField DataNavigateUrlFields="ID" DataNavigateUrlFormatString="~/pUser.aspx?field={0}" HeaderText="Select" Text="Select" />

person Dennis Myers    schedule 04.10.2014