【问题标题】:horizontal scrollbar disappear setting the last column size to fill水平滚动条消失设置最后一列的大小来填充
【发布时间】:2015-01-09 15:23:34
【问题描述】:

我有一个有 4 列的数据网格视图。我要:

  1. 显示每个单元格内的所有文本(我不想看到任何被“...”截断的文本)
  2. 最后一列填满了所有剩余空间
  3. 水平和垂直滚动条。

使用此代码:

  dataGridView.ScrollBars = ScrollBars.Both;
  Grid_NonAnatObj.AutoResizeColumns();
  GridCol_Visibility.Width = 30;

我看到每个单元格中的所有文本都没有截断,并且我看到了水平和垂直滚动条。 当我尝试添加此代码时

  Grid_NonAnatObj.Columns[3].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

为了满足2.,水平滚动条消失。 我该如何解决这个问题?

【问题讨论】:

  • 你在其他列上设置了什么属性?
  • 我怀疑这是可能的,我也看不出这样做有什么意义,因为它从来没有任何问题。除非你想为了它自己的缘故展示它..(在这种情况下可能添加一个HScrollbar 控件到 DGV.Controls 并将其停靠到底部。)
  • @Abhishek:我没有设置其他列属性,我添加了一张关于我的 datagridview 属性的图片
  • @TaW:我使用的是 Visual Studio 2008,它没有 HScrollbar 控件
  • 来自 DataGridViewAutoSizeColumnMode.Fill 上的 MSDN 文档:“列宽调整以便所有列的宽度完全填充控件的显示区域,仅需要水平滚动以保持列宽高于 DataGridViewColumn.MinimumWidth属性值。”这让我相信就像@TaW 所说的那样,滚动条不应该显示,因为网格水平完全适合。例外情况可能是列最小宽度将列推到网格宽度之外。但是,我不知道这将如何工作,这就是为什么这只是一个评论。

标签: c# winforms datagridview scrollbar autosize


【解决方案1】:

这是一个hack-around,但这是我能做的最好的模拟你想要的结果。

  1. 显示每个单元格内的所有文本(我不想看到任何被“...”截断的文本)

这意味着每列至少应将 AutoSizeMode 设置为 DisplayedCells。这会为你做合适的,所以你不必猜测,“30 宽度足够吗?也许 35 以防万一......”。从本质上讲,它还为您的列提供了一种模仿最小宽度的感觉。

但是如果你的值都很小,而现在你在最后一列的右侧有那个丑陋的未使用区域怎么办?

  1. 最后一列填满了所有剩余空间

最后一列 AutoSizeMode 到 Fill 的条件集可以解决此问题。

  1. 水平和垂直滚动条。

这有点让步,但是当最后一列设置为填充时,你就不需要水平条了。当它设置为 DisplayedCells 时,列要么完全适合您的宽度,要么大于您的宽度,在这种情况下,栏将显示。

CODEZ PLZ: 为了通过调整大小保持这种行为的一致性,我在 dgv Resize 事件中实现了它。

private void dataGridView1_Resize(object sender, EventArgs e)
{
  int width = this.dataGridView1.RowHeadersWidth;

  foreach (DataGridViewColumn col in this.dataGridView1.Columns)
  {
    col.AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
    width += col.Width;
  }

  if (width < this.dataGridView1.Width)
  {
    this.dataGridView1.Columns[this.dataGridView1.Columns.Count - 1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
  }
}

问题:这很好用,但还需要在表单构造函数中触发才能从一开始就正确显示。

public Form1()
{
  this.InitializeComponent();

  this.Examples = new BindingList<Example>() 
  {
    new Example() { First = "Foo", Last = "Bar", Test = "Small" },
    new Example() { First = "My", Last = "Example", Test = "You." }
  };

  this.dataGridView1.DataSource = this.Examples;

  this.Visible = true; // Do this or during the initial resize, the columns will still be 100 width.
  this.dataGridView1_Resize(this.dataGridView1, EventArgs.Empty); // Invoke our changes.
  //this.Examples[0].Test = "ReallyBigExampleOfTextForMySmallLittleColumnToDisplayButResizeToTheRescue";
}

编辑:如果您的单元格是可编辑的,并且有可能输入长数据导致可怕的省略号...

private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
  this.dataGridView1_Resize(this.dataGridView1, EventArgs.Empty);
}

【讨论】:

    猜你喜欢
    • 2012-10-26
    • 2017-11-10
    • 2016-05-28
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    • 2014-12-08
    • 2016-02-05
    • 2021-02-27
    相关资源
    最近更新 更多