为什么DataColumn.Caption无法工作?

18

我正在尝试创建一个DataTable并将其绑定到DataGridView。它可以工作,但我无法通过Caption属性设置列标题。它使用ColumnName("City")来显示标题。MSDN说:

“您可以使用Caption属性为DataColumn显示一个描述性或友好的名称。”

这是我的代码:

DataColumn dc = new DataColumn("City", typeof(string));
dc.Caption = "Город"; 

DataTable dt = new DataTable();
dt.Columns.Add(dc); 

DataRow row = dt.NewRow(); 
row["City"] = "Moscow";
dt.Rows.Add(row);

datagridview.DataSource = dt;
6个回答

31

好的,MSDN是正确的。那就是Caption属性的作用。然而,这并不意味着控件制造商必须使用标题属性。在这种情况下,微软没有这样做(虽然他们真的应该这样做)。您可以将代码修改为以下内容:

///snip

dataGridView1.DataSource = dt;

foreach (DataGridViewColumn col in dataGridView1.Columns) {
  col.HeaderText = dt.Columns[col.HeaderText].Caption;
}

如果您的dataTable来自强类型数据集,则它无法正常工作。我认为存在一个错误,即无法从代码中检索标题;例如,dt.Columns(n).Caption实际上检索了dt.Columns(n).ColumnName,尽管我在xsd设计器中明确将标题设置为与名称不同。 - joedotnot
我认为你应该使用 dt.Columns[col.DataPropertyName].Caption。这样可以确保它与 DataTable 中的正确列链接。 - Drew Chapin
在 .Net 5 中,Caption 属性不再可用。 - XelaNimed
.net框架4.7.2 - 仍有bug =) - Blackmeser
@XelaNimed 嗯,这个页面说 Caption 在 .NET 5、6 和 7 中可用:https://learn.microsoft.com/en-us/dotnet/api/system.data.datacolumn.caption?view=net-6.0 - Oskar Berggren

6

我认为当你绑定到一个DataTable时,DataGridView不会使用Caption属性。只有当你绑定到DataSet时才有效。

你可以像这样手动修改列标题:

dataGridView.Columns[i].HeaderText = dt.Columns[i].Caption;

1
@aquinas,这对我有效。
foreach (DataGridViewColumn col in dataGridView1.Columns) {
  col.HeaderText = dt.Columns[col.Name].Caption;
}

1
你应该试试这个:
datagridView.Columns[0].HeaderText = "Title Goes Here.";

您可以针对您添加的列数执行此操作。只有索引会更改。


1
在VB.NET代码中:
Dim dt As New DataTable
dt.Columns.Add("col1").Caption = "Your Header Text"
'and add more columns with .caption
GridView1.DataSource = dt

For Each col As DataColumn In dt.Columns
    GridView1.Columns(col.ColumnName).HeaderText = col.Caption
Next

-1
            foreach (DataTable dataTable in dataSet.Tables)
        {
            form1.Controls.Add(new LiteralControl(String.Format("<h1>{0}</h1>", dataTable.TableName)));
            GridView grid = new GridView();
            grid.AllowPaging = false;
            grid.AutoGenerateColumns = false;

            foreach (DataColumn col in dataTable.Columns)
            {
                grid.Columns.Add(new BoundField { DataField = col.ColumnName, HeaderText = col.Caption });
            }

            grid.DataSource = dataTable;
            grid.DataBind();

            form1.Controls.Add(grid);
        }

1
你能解释一下这段代码吗?来自评论 - Wai Ha Lee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接