在GridView中启用和禁用按钮

时间:2011-07-26 18:20:43

标签: c# asp.net data-binding gridview button

我在gridview中添加了一个按钮列。我正在使用数据通过代码填充gridview,然后将数据绑定到网格。

我现在需要查看数据的第一列并检查列的文本是否为“NA”,如果该列中的按钮必须被禁用.....

我怎样才能做到这一点?我正在填充代码中的数据,并且按钮被预先添加到标记中的网格

<asp:GridView ID="GridView1" runat="server" OnRowCommand="GridView1_RowCommand">
    <Columns>
        <asp:ButtonField Text="Delete" />
    </Columns>
</asp:GridView>


GridView1.DataSource = dt;
GridView1.DataBind();

5 个答案:

答案 0 :(得分:5)

最好的办法是在OnDataBinding中为Button实施TemplateColumn方法。

例如:

<asp:GridView ID="GridView1" runat="server" OnRowCommand="GridView1_RowCommand">
    <Columns>
        <asp:TemplateField>
            <ItemTemplate>
                <asp:Button runat="server" ID="btnDelete" CommandName="Delete" 
                    Text="Delete" OnDataBinding="btnDelete_DataBinding" />
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

然后在你的代码隐藏中实现你的逻辑:

protected void btnDelete_DataBinding(object sender, System.EventArgs e)
{
    Button btn = (Button)(sender);
    btn.Enabled = !Eval("TheFieldInYourDataSourceToCompare").ToString().Equals("NA");
}

以这种方式对其他已发布的答案进行处理的优势:

  1. 您的标记中没有代码
  2. 代码已本地化为Button控件,如果其他Buttons需要相同的功能,则可以重复使用。
  3. 比较DataSource值而不是视觉输出(这可能与渲染和检查的业务逻辑相关)。
  4. 希望有所帮助。

答案 1 :(得分:1)

在DataBound事件处理程序中尝试:

protected void GridView1_DataBound(object sender, EventArgs e)
{

    for (int i = 0; i < GridView1.Rows.Count; i++)
    {

        if (GridView1.Rows[i].Cells[1].Text == "NA")
        {
          // Disable the button
        }
    }
}

这只是一个普遍的想法。您必须修改应用程序的代码。

不要忘记将OnDataBound="GridView1_DataBound"添加到GridView的标记中。

答案 2 :(得分:1)

也许是这样的。 按钮有点不同

<asp:GridView ID="GridView1" runat="server" OnRowCommand="GridView1_RowCommand">
    <Columns>
        <asp:TemplateField>
            <ItemTemplate>
                <asp:Button runat="server" ID="Btn_Delete" CommandName="Delete" Text="delete" 
                    Enabled='<%# GridView1.Rows[0].Cells[1].Text != "NA" %>' />
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

你最想要的是Eval(“someColumn”)而不是GridView1.Rows [0] .Cells [1] .Text

答案 3 :(得分:0)

也许您可以使用OnRowDataBound =“GridViewRowEventHandler”将值设置为启用或禁用?

答案 4 :(得分:0)

您可以尝试使用标记,

 <asp:TemplateField HeaderText="QA signature">
                                     <EditItemTemplate>
                                         <asp:TextBox ID="TextBox2" runat="server" Text='<%# Bind("Column6") %>'></asp:TextBox>
                                     </EditItemTemplate>
                                     <ItemTemplate>
                                         <asp:Label ID="Label3" runat="server" Text='<%# Eval("Column6") %>' Visible='<%# Eval("Column6") != "" %>'  ></asp:Label>
                                         <asp:Button ID="Button2" runat="server" Text="Sign Off" CssClass="cmdButton" Visible='<%# Eval("Column6") == "" %>'  />
                                     </ItemTemplate>
                                 </asp:TemplateField>