0

我剥离了这个例子以使其简单。我有一个带有模板字段的网格视图。模板字段包含两个按钮和一个标签(它们必须在同一个模板字段中)。我希望第一个按钮将标签文本设置为“Win”,另一个按钮将标签文本设置为“失败”。onrow 命令似乎不是由模板字段中的按钮触发的。我怎样才能做到这一点?

我的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"
    }

提前致谢!

4

2 回答 2

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;        
}

!IsPostBack此外,正如艾莉森建议的那样,除非您使用in ,否则您不会看到所需的输出Page_Load。此外,这样做实际上使您能够使用最初建议的单行命令事件处理程序,尽管在标签检索中略有变化:

public void MyGridView_OnRowCommand(Object sender, GridViewCommandEventArgs e)
{
    var label = ((Button)e.CommandSource).Parent.FindControl("MyStatusLabel") as Label;
    label.Text = e.CommandName;
}
于 2011-02-09T16:10:01.063 回答
2

您是否使用关闭 ViewState 的 MasterPage?ViewState 设置为 false 的模板字段中的按钮不会触发。

此外,您应该将 Page_Load 更改为 NOT rebind on postback"

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();
      }
    }

重新绑定可能会产生干扰。

于 2011-02-09T16:15:18.603 回答