【问题标题】:GridView Column.Count is always 0 after databind with a datatable与数据表进行数据绑定后,GridView Column.Count 始终为 0
【发布时间】:2014-05-02 01:41:20
【问题描述】:

我正在尝试有条件地显示/隐藏 GridView 列。

我正在创建一个动态数据表,然后将其绑定到 GridView

稍后,在回帖中,我正在检查条件并希望显示/隐藏 GridView 的几列,但 Column.Count 始终为 0!

我的代码如下 - ASPX 页面

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

.CS 页面

 protected void Button1_Click(object sender, EventArgs e)
{
   DataTable aDT = new DataTable()
   aDT = createDataTable();   //datatable has 21 columns

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

   int temp = GridView1.Columns.Count;   //always 0
}

不知道代码有什么问题

【问题讨论】:

  • 你真正想要达到什么目的?您无法访问将AutoGenerateColumns 设置为true 的列,但您可以通过GridView1.Rows[0].Cells[0].Text 等访问所有单元格。
  • 正如我所说,如果你唯一能得到的列数,你可以这样得到:GridView1.Rows[0].Cells.Count;
  • @FarhadJabiyev:如果他唯一想要的是列数,他不应该计算行的单元格,因为可能根本没有行会导致异常。相反,他应该使用aDT.Columns.Count
  • @TimSchmelter 是的,这是真的。但是,我认为他可能想要获取 Button_Click 方法之外的列数。他可以检查 GridView 是否包含任何行。
  • @FarhadJabiyev:但是如果网格不包含任何行,他就无法从第一行的单元格计数中获取列计数。所以检查没有帮助。但aDT.Columns.Count 始终有效。

标签: c# gridview datatable


【解决方案1】:

如果您将autogeneratedcolumns 属性设置为true,则计数将始终显示为0。

来自MSDN

Columns 属性(集合)用于显式存储所有 在 GridView 控件中呈现的声明的列字段。你 也可以使用 Columns 集合以编程方式管理 列字段的集合。

在您的情况下,您没有明确声明您的列。因此,如果 GridView 至少包含一行,您可以在 Click 方法的内部和外部获取这样的列数:

一行中的单元格数 = 列数。

if(GridView1.Rows.Count>0)
    int temp = GridView1.Rows[0].Cells.Count;

或者您可以像 @TimSchmelter 评论的那样从 Click 方法中的 DataTable 中获取计数:

int temp = aDT.Columns.Count

【讨论】:

  • 但如果网格不包含行,您将无法获得列数。请改用DataTable.Columns.Count 属性,它始终有效。
  • @TimSchmelter 我已经更新了我的答案。感谢您的评论。
  • 如果我将 autogeneratedcolumns 属性设置为 false,我怎样才能获得列数?有没有办法做到这一点?
【解决方案2】:

GridView.Columns 返回一个DataControlFieldCollection

从它的备注部分:

如果您使用的是GridViewDetailsView 控件,则 DataControlField 自动创建的对象(例如, 当 AutoGenerateColumns 属性为 true) 不存储 可公开访问的字段集合。您只能访问和 操作不是自动的 DataControlField 对象 生成。

来自GridView.Columns 备注部分:

显式声明的列字段可以与 自动生成的列字段。当两者都使用时,显式 声明的列字段首先呈现,然后是 自动生成的列字段。 自动生成的列 字段不会添加到 Columns 集合中

因此,在GridView.Columns 中只能访问以声明方式添加的列。由于您已将 AutoGenerateColumns 设置为 true(默认),因此它们不会添加到 Columns 集合中。

如果您需要列数,您应该使用您的DataSourceDataTable 有一个 Columns property,即使表不包含行也会被初始化:

int temp = aDT.Columns.Count;   

【讨论】:

  • 好的,感谢您抽出宝贵时间,获取列名的替代方法是什么?
  • @user1889838: DT.Columns.Count,即使不包含行,DataTable 的列也会被设置(与 GridView.Rows[0].Cells. Count 相对)。编辑了我的答案。
【解决方案3】:

在 ASPX 页面中更改这些:

  1. 设置 autogeneratecolumns="false"。
  2. 添加&lt;columns&gt;标签如下:
 <asp:GridView ID="GridView1" autogeneratecolumns="false" runat="server">
    <columns>
        <asp:boundfield datafield="CustomerID" headertext="Customer ID"/>
        <asp:boundfield datafield="CompanyName" headertext="Company Name"/>
        <asp:boundfield datafield="Address" headertext="Address"/>
        <asp:boundfield datafield="City" headertext="City"/>
        <asp:boundfield datafield="PostalCode" headertext="Postal Code"/>
        <asp:boundfield datafield="Country" headertext="Country"/>
     </columns>
 </asp:GridView>

在 .CS 文件中:

int temp = GridView1.Columns.Count; // 将返回 6

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-05
    • 2012-04-26
    • 2011-09-10
    • 1970-01-01
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多