18

I am trying to create a DataTable and bind it to a DataGridView. It works, but I can't set columns headers via the Caption property. It displays headers using the ColumnName ("City") instead. MSDN says that

"You can use the Caption property to display a descriptive or friendly name for a DataColumn."

Here is my code:

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;
Sнаđошƒаӽ
  • 16,753
  • 12
  • 73
  • 90
Alex P.
  • 3,697
  • 9
  • 45
  • 110

6 Answers6

31

Well, MSDN is right. That is what the Caption property is for. However, that doesn't mean that control makers have to use the caption property. In this case, Microsoft didn't do that (although they really should have). You can modify your code to this though:

///snip

dataGridView1.DataSource = dt;

foreach (DataGridViewColumn col in dataGridView1.Columns) {
  col.HeaderText = dt.Columns[col.HeaderText].Caption;
}
aquinas
  • 23,318
  • 5
  • 58
  • 81
  • It does not work if your dataTable comes from a strongly-typed dataset. Me thinks there is a bug in that the caption cannot be retrieved from code; e.g dt.Columns(n).Caption actually retrieves the dt.Columns(n).ColumnName even though i clearly set the Caption to be different from Name in the xsd designer. – joedotnot Mar 23 '16 at 00:33
  • I think you should use `dt.Columns[col.DataPropertyName].Caption` instead. This will insure it's linked to the correct column in the `DataTable`. – Drew Chapin Apr 19 '16 at 19:38
  • In .Net 5 Caption property is no longer available – XelaNimed Apr 01 '21 at 13:07
  • .net fw 4.7.2 - still bug =) – Blackmeser Oct 29 '21 at 04:11
  • @XelaNimed Well this page says Caption is available in .NET 5, 6 and 7: https://learn.microsoft.com/en-us/dotnet/api/system.data.datacolumn.caption?view=net-6.0 – Oskar Berggren Mar 24 '22 at 21:04
6

I think when you bind to a DataTable, the DataGridView does not use the Caption property. It only works when you bind to a DataSet.

You can modify the column headers manually like this:

dataGridView.Columns[i].HeaderText = dt.Columns[i].Caption;
Nick Bray
  • 1,953
  • 12
  • 18
1

You should try this:

datagridView.Columns[0].HeaderText = "Title Goes Here.";

You may do this for the number of columns you have added. Only the index will change.

TriumphTruth
  • 51
  • 10
1

in vb.net code :

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

@aquinas, this works for me

foreach (DataGridViewColumn col in dataGridView1.Columns) {
  col.HeaderText = dt.Columns[col.Name].Caption;
}
Sнаđошƒаӽ
  • 16,753
  • 12
  • 73
  • 90
P.A. SOW
  • 53
  • 5
-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);
        }
Bruno
  • 21
  • 1