【问题标题】:DataGridView White Space After Last Column Header最后一列标题后的 DataGridView 空白
【发布时间】:2009-09-30 19:04:46
【问题描述】:

我正在尝试模仿其他所有表格视图对 DataGridView 控件所做的操作,但我似乎无法正确获取标题。

我想要所有标题右侧的空白标题,它不会移动,实际上不是标题。有没有办法在顶部绘制默认标题?

基本上,这是我的问题:

【问题讨论】:

  • +1 用于链接到屏幕截图。我希望更多的人这样做。一张图片值 1K 字。

标签: .net datagridview header paint


【解决方案1】:

试试这个

Dim dt As New DataTable()
dt.Columns.Add("a")
dt.Columns.Add("b")
dt.Rows.Add(dt.NewRow())
dt.Rows.Add(dt.NewRow())
dt.Rows.Add(dt.NewRow())
dt.Rows.Add(dt.NewRow())
dt.Rows.Add(dt.NewRow())
dt.Rows.Add(dt.NewRow())
dt.Columns.Add(" ")
dt.AcceptChanges()
DataGridView1.DataSource = dt
DataGridView1.AutoSize = True
DataGridView1.Columns(2).AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill
DataGridView1.Columns(2).Resizable = DataGridViewTriState.False

【讨论】:

  • +1,我也建议。只需添加一个没有 HeaderText 并将 AutoSizeMode 设置为 Fill 的列。
【解决方案2】:

虽然它不能回答您的问题,但另一种方法是将AutoSizeColumnsMode 设置为Fill

【讨论】:

  • 这确实有效,但如果我有很多列(在这种情况下我会这样做)填充选项并不能很好地工作。我需要能够滚动。我还尝试将最后一列设置为“填充”,但是您必须动态设置最小尺寸。这仍然不是我见过的大多数表格控件的工作方式
【解决方案3】:

添加所有列后,您可以添加一个额外的列,将以下属性设置为:

 AutoSizeMode = Fill;
 HeaderText = ""
 ReadOnly = true;
 SortMode = NotSortable;

,通过防止绘制边框来处理此特定列的gridView CellPainting event

 private void dataGridView1_CellPainting(object sender, 
                                         DataGridViewCellPaintingEventArgs e)
 {
     if (e.RowIndex > -1 && e.ColumnIndex == dataGridView1.Columns.Count - 1)
     {
         e.AdvancedBorderStyle.All = DataGridViewAdvancedCellBorderStyle.None;
         e.PaintBackground(e.ClipBounds, false);
         e.Handled = true;
     }
 }

你会得到你想要的。

【讨论】:

    【解决方案4】:

    IMO,最好(也是最有效)的方法是在最后创建一个额外的列,让它“吃掉”(或“占用” ) 未被其他列占用的空间。这样做的方法是将 AutoSizeMode 属性设置为 Fill

    这里是一些示例代码:

    DataGridView grid = new DataGridView();
    DataTable data = new DataTable();
    
    //add columns, rows, etc. to DataTable data
    data.Columns.Add("This is the first column."); data.Rows.Add(data.NewRow());
    //etc.
    
    //Add EXTRA column:
    
    data.Columns.Add(""); //blank header
    
    //Save changes
    
    data.AcceptChanges();
    
    //Set datasource
    grid.DataSource = data;
    

    现在,您有了网格,还有一个额外的空白列。 我们必须将列设置为正确的属性:

    data.Columns(1).AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; //Sets AutoSizeMode to fill, as explained above, for 2nd column
    

    此外,正如 najameddine 所解释的,您可能需要设置以下属性:

    只读=真;

    排序模式 = 不可排序;

    本质上,您正在创建一个占用空白空间的空白列。

    附:我刚刚注意到 surajitkhamrai 有一个非常相似的代码示例,但我的是 C# - 但是,概念保持不变。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-20
      • 2011-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-21
      • 1970-01-01
      相关资源
      最近更新 更多