2011-02-09 13 views
0

私はこの例を簡単にするために取り除きました。私はテンプレートフィールドを持つgridviewを持っています。テンプレートフィールドには2つのボタンとラベルがあります(これらは同じテンプレートフィールドになければなりません)。最初のボタンでラベルテキストを "Win"に設定し、もう一方のボタンでラベルテキストを "失敗"に設定します。 onrowcommandは、テンプレートフィールドのボタンによってトリガーされないようです。どうすればこれを達成できますか?GridViewでは、1つのアイテムテンプレートに複数のコマンドを追加する方法は?

私のGridViewのコードは以下の通りです:

 <asp:GridView ID="GridView1" runat="server" EnableModelValidation="True" AutoGenerateColumns="False" 
     OnRowCommand="Gridview1_RowCommand"> 
     <Columns> 
      <asp:TemplateField ShowHeader="False"> 
       <ItemTemplate> 
        <asp:Button ID="btnWin" runat="server" CommandName="Win" Text="Win" /> 
        <asp:Button ID="btnFail" runat="server" CommandName="Fail" Text="Fail" /> 
        <asp:Label ID="lblStatus" runat="server" Text='<%# Bind("text") %>'></asp:Label> 
       </ItemTemplate> 
      </asp:TemplateField> 
     </Columns> 
    </asp:GridView> 

と後ろの私のコード:事前に

protected void Page_Load(object sender, EventArgs e) 
    { 
     DataTable myTable = new DataTable(); 
     myTable.Columns.Add("text", typeof(string)); 
     myTable.Rows.Add("First Entry"); 
     myTable.Rows.Add("Second Entry"); 

     GridView1.DataSource = myTable; 
     GridView1.DataBind(); 
    } 

    public void Gridview1_RowCommand(Object sender, GridViewCommandEventArgs e) 
    { 
     //set lblStatus.text to "Win", or "Fail" 
    } 

ありがとう!

答えて

2

ここに行く...

public void Gridview1_RowCommand(Object sender, GridViewCommandEventArgs e) 
{ 
    lblStatus.Text = e.CommandName; 
} 

私は私と一緒に耐え、ここで答えているよりも、この質問へのより多くがあることがわかります。一つの方法は、以下のように、その指定されたイベントハンドラに各ボタンのOnCommandイベントを委任することになります。

<div> 
    <asp:GridView ID="MyGridView" runat="server" EnableModelValidation="true" AutoGenerateColumns="False"> 
     <Columns> 
      <asp:TemplateField ShowHeader="False"> 
       <ItemTemplate> 
        <asp:Button ID="MyWinButton" runat="server" OnCommand="MyWinButton_OnCommand" CommandName="Win" Text="Win" /> 
        <asp:Label ID="MyStatusLabel" runat="server" Text='<%# Bind("text") %>'/> 
       </ItemTemplate> 
      </asp:TemplateField> 
     </Columns> 
    </asp:GridView> 
</div> 

public void MyWinButton_OnCommand(Object sender, CommandEventArgs e) 
{ 
    var label = ((Button)sender).Parent.FindControl("MyStatusLabel") as Label; 
    label.Text = e.CommandName;   
} 

また、アリソンが示唆するように、あなたがPage_Load!IsPostBackを使用しない限り、あなたはこの所望の出力は表示されません。さらに、これは実際にはラベル検索のわずかな変化はあるものの、当初提案として1行のコマンドイベントハンドラを使用することができますないそうで:

public void MyGridView_OnRowCommand(Object sender, GridViewCommandEventArgs e) 
{ 
    var label = ((Button)e.CommandSource).Parent.FindControl("MyStatusLabel") as Label; 
    label.Text = e.CommandName; 
} 
+0

ありがとう!素晴らしい作品! – Starwfanatic

2

あなたはViewStateのでマスターページを使用していますオフに? ViewStateをfalseに設定したテンプレートフィールドのボタンは起動しません。

また、あなたがポストバックに再バインドしないように、あなたのPage_Loadを変更する必要があります」

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!page.IsPostBack) { 
     DataTable myTable = new DataTable(); 
     myTable.Columns.Add("text", typeof(string)); 
     myTable.Rows.Add("First Entry"); 
     myTable.Rows.Add("Second Entry"); 

     GridView1.DataSource = myTable; 
     GridView1.DataBind(); 
     } 
    } 

再バインドを妨害することができる。

+0

は助けてくれてありがとう。ViewStateが防止されました私はこの例を一緒に投げ捨てて、見落とした!IsPostBack – Starwfanatic

関連する問題