0

我有一个完全以编程方式结合的网格视图。我想隐藏一些列并丰富它们以在标签中显示它们。

这是我的网格视图:

<Gridview ID=Gridview1 runat="server" ></Gridview>

我想隐藏 EmpID 和 UnitID 。并希望在前端的标签中显示它们

EmpID  EmpName UnitID  UnitName    
--------------------------------
 1      jack     4      MyUnit

我正在尝试使用此代码,但它不工作甚至给我错误

 if (GridForUnits.Columns.Count > 1)
        {
           GridForUnits.Columns[1].Visible = false;
           //GridForUnits.Columns[1].Visible = false;
        }

任何帮助感谢

谢谢

4

5 回答 5

1

如果要根据逻辑隐藏列,则需要使用RowDataBound

将来维护起来有点容易。

这是示例。您可以隐藏或显示您喜欢的任何列。

在此处输入图像描述

<asp:GridView ID="GridView1" runat="server" OnRowDataBound="GridView1_RowDataBound" 
    AutoGenerateColumns="False">
    <Columns>
        <asp:BoundField HeaderText="EmpID" DataField="EmpID" />
        <asp:TemplateField HeaderText="EmpName" >
            <ItemTemplate>
                <asp:Label runat="server" ID="EmpNameLabel" 
                    Text='<%# Eval("EmpName") %>' />
            </ItemTemplate>
        </asp:TemplateField>
        <asp:BoundField HeaderText="UnitID" DataField="UnitID" />
        <asp:TemplateField HeaderText="UnitName" >
            <ItemTemplate>
                <asp:Label runat="server" ID="UnitNameLabel" 
                    Text='<%# Eval("UnitName") %>' />
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>


public class Employee
{
    public int EmpID { get; set; }  
    public string EmpName  { get; set; }  
    public int UnitID  { get; set; }
    public string UnitName { get; set; }  
}

protected void Page_Load(object sender, EventArgs e)
{
    GridView1.DataSource = new List<Employee>
    {
    new Employee { EmpID = 1, EmpName = "One", UnitID = 100, UnitName = "One hundred"},
    new Employee { EmpID = 2, EmpName = "Two", UnitID = 200, UnitName = "Two hundred"},
    new Employee { EmpID = 3, EmpName = "Three", UnitID = 300, UnitName = "Three hundred"},
    new Employee { EmpID = 4, EmpName = "Four", UnitID = 400, UnitName = "Four hundred"}
    };
    GridView1.DataBind();
}


protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        var employee = e.Row.DataItem as Employee;
        var empNameLabel = e.Row.FindControl("EmpNameLabel") as Label;
        var unitNameLabel = e.Row.FindControl("UnitNameLabel") as Label;

        if (employee.UnitID == 200)
        {
            empNameLabel.Visible = false;
            unitNameLabel.Visible = false;
        }
    }
}
于 2013-05-21T22:43:03.757 回答
0

我将假设您正在绑定到 DataTable。你需要

  1. 自定义您的 GridView 以仅显示您希望显示的列。
  2. 在 GridView 属性窗口中将 AutoGenerateColumn 设置为 false。
  3. 从绑定到的 DataTable 访问 EmpID 和 UnitID 信息,而不是从 GridView。

希望这可以帮助

于 2013-05-21T22:49:11.027 回答
0

是的,实际上有一个简单的方法可以做到这一点。

您可能会收到一个错误,因为当您 autogenerate列时,计数始终为 0。

在你之后Databind,遍历你的列并按索引隐藏它们。我也会假设你的数据源是DataTable这个例子的一个。

        DataTable dt = new DataTable();
        dt.Columns.Add("EmpID");
        dt.Columns.Add("EmpName");
        dt.Columns.Add("UnitID");
        dt.Columns.Add("UnitName");
        DataRow dr = dt.NewRow();
        dr["EmpID"] = 1;
        dr["EmpName"] = "Jack";
        dr["UnitID"] = 4;
        dr["UnitName"] = "MyUnit";
        dt.Rows.Add(dr);

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

        //GridView1.Columns[0].Visible = false; // will error on autogenerate columns
        // So after your data is bound, loop though

        int columnIndexEmpID = 0;
        int columnIndexUnitID = 2;

        GridView1.HeaderRow.Cells[columnIndexEmpID].Visible = false;
        GridView1.HeaderRow.Cells[columnIndexUnitID].Visible = false;
        foreach (GridViewRow gvr in GridView1.Rows)
        {
            gvr.Cells[columnIndexEmpID].Visible = false;
            gvr.Cells[columnIndexUnitID].Visible = false;
        }

您需要将RowDataBound事件附加到网格视图。

<asp:GridView ID="GridView1" runat="server" 
    onrowdatabound="GridView1_RowDataBound">
</asp:GridView>

在这里,您可以访问隐藏的值。

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    DataRowView drv = (DataRowView)e.Row.DataItem;
    if (drv != null)
    {
        string cellValue = Convert.ToString(drv["EmpID"]);// By column name
    }
}

至于用标签丰富数据网格,Win 为您提供了一个优雅的解决方案:P

于 2013-05-21T23:17:46.087 回答
0

在 GridView OnRowDataBound 方法中编写以下代码以隐藏特定列

protected void gvDetails_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.Header)
    {
        e.Row.Cells[colIndex].Visible = false;
    }
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        e.Row.Cells[colIndex].Visible = false;
    }
}
于 2021-03-20T17:49:30.150 回答
0
GridView1.DataBind();
if (GridView1.Columns.Count > 0)
    GridView1.Columns[0].Visible = false;
else
{
    GridView1.HeaderRow.Cells[0].Visible = false;
    foreach (GridViewRow grow in GridView1.Rows)
    {
        grow.Cells[0].Visible = false;
    }
}
于 2018-09-03T08:24:22.337 回答