【问题标题】:DataGridView display row header cellDataGridView 显示行标题单元格
【发布时间】:2010-11-19 00:52:09
【问题描述】:

我正在尝试显示一个链接到 DataTable 的简单 DataGridView,我最终希望 DataTable 中的第一列成为 DataGridView 的行标题单元格。在这一点上,我将满足于在行标题单元格中具有任何值。我可以使用我的所有行和列以及列标题单元格显示 DataGridView,但没有行标题单元格。我检查row.HeaderCell.Value中的值,我放在那里的数据就在那里。我检查了 row.HeaderCell.Displayed 并且它是假的,但这是只读的,所以我不能让它成为真的。如何让行标题单元格显示?

这是我尝试使其工作的一个简单示例:

        DataTable table = new DataTable();
        for (int i = 0; i<10; i++)
        {
            table.Columns.Add(new DataColumn("column-" + i));
        }

        for (int i = 0; i < 10; i++)
        {
            DataRow theRow = table.NewRow();

            for (int j = 0; j < 10; j++)
                theRow[j] = i + "-" + j;
            table.Rows.Add(theRow);

        }

        dataGridView1.DataSource = table;
        dataGridView1.RowHeadersWidthSizeMode = System.Windows.Forms.DataGridViewRowHeadersWidthSizeMode.AutoSizeToDisplayedHeaders;
        int rowNumber = 1;
        foreach (DataGridViewRow row in dataGridView1.Rows)
        {
            if (row.IsNewRow) continue;
            row.HeaderCell.Value = "Row " + rowNumber;
            rowNumber = rowNumber + 1;
        }
        dataGridView1.AutoResizeRowHeadersWidth(
            DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders);

【问题讨论】:

    标签: c# .net datagridview


    【解决方案1】:

    如果将此代码放在构造函数中,它将不起作用。将代码移动到表单的Load 事件中,它应该可以正常工作。 Windows.Forms 和 C# 的一个常见问题是在构造函数中使用了不正确的初始化。许多控件直到构造函数完成后才完全创建。 (我忘记了原因,但我相信这是因为尚未创建句柄。)如果您按照 Microsoft 的建议在 Load 事件中进行初始化,可以避免许多“变通办法”。

    【讨论】:

      【解决方案2】:

      只需调用 ToString() 如下所示

       row.HeaderCell.Value = ("Row " + rowNumber).ToString();
      

      【讨论】:

      • @Andro Selva:如果此逻辑链接到 CTOR,那么在呈现表单时我看不到 HeaderCell 值。如果我在 Form_Load() 中调用此方法,则此方法有效。 :)
      • 嘿,在尝试了其他所有方法之后,我尝试了这个并且它成功了。感谢您的信息!
      【解决方案3】:

      【讨论】:

      • 这会完全打开和关闭标题单元格,我的问题是我在单元格中输入的值没有显示在显示器中。在下面想通了。
      【解决方案4】:

      答案似乎是处理 DataGridView.CellFormatting 事件。为什么在其他地方设置值不起作用我无法理解,但我确信这是有原因的。我添加了以下事件处理程序,一切都很好:

          private void dataGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
          {
              DataGridView gridView = sender as DataGridView;
      
              if (null != gridView)
              {
      
                  gridView.Rows[e.RowIndex].HeaderCell.Value = gridView.Rows[e.RowIndex].Cells[0].Value;
                  Console.WriteLine("GridViewCell: " + gridView.Rows[e.RowIndex].Cells[0].Value);
      
              }
          }
      

      【讨论】:

      • 我相信这是某种错误。在VB.NET中,可以根据需要设置HeaderCell.Value。然而,您必须求助于您在 C# 中的工作。
      • 这是因为代码是从构造函数运行的。将代码移动到 Load 事件或其他事件处理程序。
      • 每列都调用这个,有点浪费。您可能想要更改它,以便在设置 HeaderCell.Value 之前检查 e.ColumnIndex == 0。
      【解决方案5】:

      通过绑定或手动将值分配给 datagridview 后,我执行了以下操作:

      foreach (DataGridViewRow row in dgvValues.Rows)
      {
           row.HeaderCell.Value = (row.Index+1).ToString();
      }
      

      它对我有用。我认为在 Linq 中应该有一些更简单的解决方法。

      【讨论】:

        【解决方案6】:

        我使用了 Karl 的答案,但将事件处理程序更改为 RowsAdded,假设行标题名称在创建行后不会更改。 CellFormatting 的问题是每列都会调用它,因此一遍又一遍地设置 HeaderCell.Value 会浪费一些时间。

            private void dataGridViewVersions_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
            {
                DataGridView gridView = sender as DataGridView;
                MyData vr = gridView.Rows[e.RowIndex].DataBoundItem as MyData ;
                if (vr != null)
                {
                    gridView.Rows[e.RowIndex].HeaderCell.Value = vr.RowName.ToString();
                }
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-02-27
          • 1970-01-01
          • 1970-01-01
          • 2018-12-31
          • 1970-01-01
          • 2012-03-23
          相关资源
          最近更新 更多