どのように私はプログラム的にGridViewにボタンを追加し、特定のコードビハインド機能に割り当てていますか?

StackOverflow https://stackoverflow.com/questions/2418379

質問

ランタイムでは、私は、DataTableの作成とテーブルを移入するループのために、ネストされた使用しています。この表Iは、後のGridViewのデータソースとして割り当て、RowDataBoundにIは、各セルの値を割り当てます。私は、各セルにボタンを与え、分離コードの関数にそのボタンを割り当てることができる方法を知りたいです。私は、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();
        }

    }
}

私はこのようなものでbuttonclickを処理したいと思います:

protected void DiceButton_Click(int column, int row, int value)
{
    //Do whatever
}

任意の提案ですか?

役に立ちましたか?

解決

マークアップであなたのGridViewで、どちらかあなたは(ここで私は、現在のgridviewrowのインデックスを選択してください)あなたのボタンの内側たいCommandArgument属性を割り当てます。

 <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が正しくイベントメソッドを起動するために取得するためには、ページのLoadイベントの前に、ページのコントロール階層にButtonコントロールを追加する必要があります。私は通常、InitイベントまたはCreateChildControlsの方法でそれを行うます。

あなたの問題を解決するために、私は、テンプレートのマークアップ内のすべてのセルにボタンを追加することをお勧めします、それはそこにイベントハンドラを参照しています。次に、あなたのRowDataBound方法がオンまたはオフボタンの可視性を反転処理しています。

これを行うための最も簡単な方法は、ちょうど(あなたが好きな場合は、ボタンではなく、ハイパーリンクを使用することができます)あなたのGridViewに列を追加されます:

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top