2011-02-09 84 views
0

我剝離了這個例子來簡化它。我有一個模板字段的網格視圖。模板字段包含兩個按鈕和一個標籤(它們必須位於相同的模板字段中)。我想要第一個按鈕將標籤文本設置爲「贏」,另一個按鈕將標籤文本設置爲「失敗」。 onrowcommand似乎不是由模板字段中的按鈕觸發的。我怎樣才能做到這一點?在GridView中,如何將多個命令添加到一個項目模板?

我的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 。此外,在這樣但這實際上讓你使用一個行命令事件處理程序,最初建議,儘管在標籤檢索略有變化:

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

謝謝!偉大的作品! – Starwfanatic 2011-02-09 22:10:04

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

謝謝你的幫助。該視圖狀態是防止這個事件是由於射擊,我只是把這個例子扔在一起,忽略了!IsPostBack – Starwfanatic 2011-02-09 21:21:16

相關問題