禁用基于数据库表列值的网格视图行

本文关键字:网格 视图 数据库 | 更新日期: 2023-09-27 18:35:37

我有一个从数据库表加载的网格视图。表中有一列名为"valid",其值为"Y"或"N"。现在,我想做的是,检查"valid"的值是否为 Y,那么该行中的整个记录在加载网格视图时应显示为禁用。

如何进行? 我应该为此编写一个过程,还是可以从代码隐藏中完成?

注意:有效列不是网格视图的一部分。

禁用基于数据库表列值的网格视图行

您需要使用 gridview RowDataBound事件来禁用行。
请注意,如果您使用databound columns则它以tr呈现并td然后您需要找到单元格,然后设置 disable 属性。

protected void gvEntity_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
       //CheckBox cbAttachClrReq = (CheckBox) e.Row.FindControl("chkAdd");
       //check the value here and set enable property
       e.Row.Enabled = false;
    }
}

正如 Escaño @Hanlet所建议的那样,您可以在同一列中添加字段值,如下所示

<asp:TemplateField>
   <ItemTemplate>
      <<asp:Label ID="lbl1" runat="server" 
             Value='<%# Eval("Name") %>' />
      <asp:HiddenField ID="HiddenField1" runat="server" 
             Value='<%# Eval("valid") %>' />
</ItemTemplate>

并获取行数据绑定事件中的隐藏字段值,如下所示

protected void gvEntity_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
       HiddenField Hf = (HiddenField) e.Row.FindControl("HiddenField1");
       if(Hf.Value=="Y")
           e.Row.Enabled = false;
    }
}

尝试以下操作。

此示例获取每条记录的DataRowView,然后从基础数据源中提取要测试的valid列。

 protected void grdDetails_RowDataBound(object sender, GridViewRowEventArgs e)
 {
       if (e.Row.RowType == DataControlRowType.DataRow)
       {
           var dr = e.Row.DataItem as DataRowView; 
              if(Convert.ToString(dr["valid"]) == 'Y')
                  e.Row.Enabled = false;
       }
  }

和标记

<asp:GridView ID="grdDetails" runat="server" OnRowDataBound="grdDetails_RowDataBound"