在GridView中启用和禁用按钮

4
我已经向GridView添加了一个按钮列。我通过代码填充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个回答

5

最好的做法是在TemplateColumn中实现ButtonOnDataBinding方法。

例如:

<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值而不是视觉输出(这可能与业务逻辑相关,用于呈现和检查)。
希望这有所帮助。

以上的C#代码有语法错误,请注意...在toString后面缺少括号()。 - Al Lelopath
@mickey 谢谢。虽然是旧帖子,但我已经修复了 :) 希望有所帮助。 - Kelsey
我尝试按照Kelsey的建议实现,但我有一个DataGrid而不是GridView。我遇到了这个运行时错误:Parser Error Message: System.Web.UI.WebControls.DataGridColumnCollection必须具有类型为'System.Web.UI.WebControls.DataGridColumn'的项。'asp:TemplateField'的类型为'System.Web.UI.WebControls.TemplateField'。,因此我认为我必须使用asp:TemplateColumn代替。 - Al Lelopath

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

这只是一个大致的想法。你需要根据你的应用程序修改代码。

不要忘记在GridView的标记中添加OnDataBound="GridView1_DataBound"


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。

不错的替代方案。不过要指出一点 - 你已经硬编码了Rows[0]。你可能希望根据相应的行而不是每次都是第一行来启用/禁用 :) - Tim
是的,当然。因为Nick没有提供完整的代码,所以我这样做了。 - abney317
所以根据情况,Eval("DatabaseColumn")可能会起作用。 - abney317

0
也许你可以使用 OnRowDataBound="GridViewRowEventHandler" 来设置启用或禁用的值?

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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接