在页面加载期间或数据绑定之前删除 TemplateField

Remove TemplateField during page load or before databind

我想在页面加载期间或数据绑定到 GridView 之前从 gridview 中删除模板字段。我有 2 个用于检索数据的数据源。从其中一个数据源检索的数据没有 ExpireDate 和 ExpireDays 列。

因此,如果从没有这两个字段的数据源填充 GridView,我想删除对应于 ExpireDate 和 ExpireDays 的模板字段。

将可见性设置为 false 仍然会出现 DataRowView 不包含 属性 名称 ExpireDate 和 ExpireDays 的错误。

标记

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" OnRowCommand="GridView1_RowCommand" OnRowDataBound="GridView1_RowDataBound">
 <Columns>
    <asp:BoundField DataField="ID" HeaderText="No."/>
    <asp:BoundField DataField="Name" HeaderText="Name"/>
    <asp:BoundField DataField="CourseName" HeaderText="Course Enroll" />
    <asp:BoundField DataField="SubMember" HeaderText="ChildMember" />
    <asp:TemplateField HeaderText="Expiry Days">
        <ItemStyle HorizontalAlign="Center" />
        <ItemTemplate>
            <asp:Label runat="server" ID="expDsL" Text=' <%# Eval("ExpiryDays") %>'>
            </asp:Label>
        </ItemTemplate>
        </asp:TemplateField>
    <asp:TemplateField HeaderText="Expiry On">
        <ItemStyle HorizontalAlign="Center" />
            <ItemTemplate>
            <asp:Label runat="server" ID="expDeL" Text=' <%# Eval("ExpiryDate") %>'>
            </asp:Label>
       </ItemTemplate>
   </asp:TemplateField>
   <asp:TemplateField HeaderText="Function">
           <ItemStyle HorizontalAlign="Center" Width="100px"></ItemStyle>
           <ItemTemplate>
                  <asp:ImageButton ImageUrl="~/Images/editB.gif" ID="btnEdit" runat="server" ToolTip="Edit" CommandName="Edit"  CommandArgument='<%# Eval("ID") %>' />
                  <asp:ImageButton ImageUrl="~/Images/delB.gif" ID="btnDelete" runat="server" ToolTip="Delete" CommandName="Delete"  CommandArgument='<%# Eval("ID") %>' />
          </ItemTemplate>
   </asp:TemplateField>
 </Columns>
</asp:GridView>

代码隐藏

protected void Page_Load(object sender, EventArgs e)
{
     if(Class.ToLower() != "classAA")
     { 
        // using naveen answer can remove the column.
        var expiryDateF = ((DataControlField)GridView1.Columns.Cast<DataControlField>().Where(fid => fid.HeaderText == "Expiry Days").SingleOrDefault());
        var expiryDaysF = ((DataControlField)GridView1.Columns.Cast<DataControlField>().Where(fid => fid.HeaderText == "Expiry On").SingleOrDefault());

        if (expiryDateF != null)
        {
            GridView1.Columns.Remove(expiryDateF);
        }

        if (expiryDaysF != null)
        {
            GridView1.Columns.Remove(expiryDaysF);
        }
     } 

    if(!this.IsPostBack)
    {
         BindData();
    }
}

protected void SaveMember(object sender, EventArgs e)
{
    //getting member information and perform checking.

    bool success = dbbb.AddMem(memberdetails);
    if(success == true)
    {
        BindData();
    }
    else
    {
         //prompt fail message.
    }
}

protected void BindData()
{
    DataTable dt = dbbb.RetrieveList(); 
    if(dt != null)
    {
         GridView1.DataSource = dt;
         GridView1.DataBind();
    }
}

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if(e.Row.RowType == DataControlRowType.DataRow)
    {
        ImageButton btnDel = (ImageButton)e.Row.FindControl("btnDelete");
        btnDel.Attributes.Add("onclick", "return confirm('Are you sure you want to delete this member?')");
    }
}

如何删除该列?

附加到网格的rowDataBound事件,在那里你可以动态设置它。

您必须知道要隐藏的字段的数据源名称, 例如,单元格的标题文本是 "SomeHeader",但该单元格的数据绑定字段名称是

"SomeOtherName"

然后你必须像这样检查它(通过 GetColumnIndexByName 调试)和 检查

的值

((BoundField)cell.ContainingField).DataField

int GetColumnIndexByName(GridViewRow row, string columnName)
{
    int columnIndex = 0;
    foreach (DataControlFieldCell cell in row.Cells)
    {
        if (cell.ContainingField is BoundField)
            if (((BoundField)cell.ContainingField).DataField.Equals(columnName))
                break;
        columnIndex++; // keep adding 1 while we don't have the correct name
    }
    return columnIndex;
}

remember that the code above will use a BoundField... then use it like:

protected void GridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        int index = GetColumnIndexByName(e.Row, "SomeOtherName");
        string columnValue = e.Row.Cells[index].Text;
    }
}

实现此目的的两种方法

方法 1 - 按索引删除

if(!table.Columns.Contains("CustomerID1"))
{
    //seven is the column index here. ie, 8th column
    CustomersGrid.Columns.RemoveAt(7);
}

方法 2 - 使用列 Header 文本删除

var expiryDateField= ((DataControlField)CustomersGrid.Columns
        .Cast<DataControlField>()
        .Where(fld => fld.HeaderText == "Expiry Date")
        .SingleOrDefault());
if(expiryDateField != null)
{
    CustomersGrid.Columns.Remove(expiryDateField);
}

请注意

  1. CustomersGrid这里是asp:GridView的名字。
  2. table 是作为 GridView
  3. DataSourceDataTable
  4. 代码应在 GridView
  5. DataBind 之前调用