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

时间:2015-04-23 08:51:37

标签: asp.net gridview

我想在pageload期间或在数据绑定到GridView之前从gridview中删除templatefield。我有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?')");
    }
}

如何删除列?

2 个答案:

答案 0 :(得分:0)

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

您必须知道要隐藏的字段的数据源名称, 例如,单元格的headertext是“SomeHeader”,但该单元格的数据字段名称是

  

“SomeOtherName”

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

的值
  

((绑定列)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 :(得分:0)

实现此目的的两种方法

方法1 - 按索引删除

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

方法2 - 使用列标题文本删除

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是充当DataTable
  3. DataSource的{​​{1}}
  4. 应在GridView
  5. DataBind之前调用代码