В GridView, как добавить несколько команд в один шаблон элемента? - PullRequest
0 голосов
/ 09 февраля 2011

Я вырезал этот пример, чтобы сделать его простым. У меня есть gridview с полем шаблона. Поле шаблона содержит две кнопки и метку (они должны находиться в одном поле шаблона). Я хочу, чтобы первая кнопка установила текст метки на «Win», а другая кнопка чтобы установить текст метки на «fail». Команда onrow не запускается кнопками в поле шаблона. Как я могу сделать это?

Мой код сетки ниже:

        <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 ]

2 голосов
/ 09 февраля 2011

Используете ли вы MasterPage с выключенным 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();
      }
    }

Переплет может мешать.

2 голосов
/ 09 февраля 2011

Вот, пожалуйста ...

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 в Page_Load. Кроме того, при этом это фактически позволяет вам использовать однострочный командный обработчик события, как первоначально предлагалось, хотя и с небольшим изменением в извлечении метки:

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