0

簡単にするために、この例を削除しました。テンプレート フィールドを持つグリッドビューがあります。テンプレート フィールドには、2 つのボタンと 1 つのラベルが含まれています (これらは同じテンプレート フィールドにある必要があります)。最初のボタンでラベル テキストを「勝利」に設定し、もう 1 つのボタンでラベル テキストを「失敗」に設定します。onrowcommand は、テンプレート フィールドのボタンによってトリガーされないようです。どうすればこれを達成できますか?

私のグリッドビューコードは以下の通りです:

        <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

ViewState をオフにして MasterPage を使用していますか? 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();
      }
    }

再バインドが干渉している可能性があります。

于 2011-02-09T16:15:18.603 に答える
2

どうぞ...

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

この質問には、ここで回答されている以上のことがあると思いますが、ご容赦ください。OnCommand1 つの方法は、次のように、各ボタンのイベントを指定されたイベント ハンドラーに委任することです。

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

また、アリソンが示唆するように、 in を使用!IsPostBackしない限り、これの目的の出力は表示されませんPage_Load。さらに、これを行うと、ラベルの取得がわずかに変更されますが、最初に提案されたように、実際には1行コマンドイベントハンドラーを使用できます。

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 に答える