水平滚动条消失,设置要填充的最后一列大小

时间:2015-01-09 15:23:35

标签: c# winforms datagridview scrollbar autosize

enter image description here我有一个包含4列的datagridview。我想要:

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

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

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

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

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

1 个答案:

答案 0 :(得分:3)

这是一个黑客攻击,但这是我能做的最好的模拟你想要的结果。

  
      
  1. 显示每个单元格内的所有文本(我不希望看到任何文本被" ...";
  2. 截断)   

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

但是,如果你的价值都很小,现在你在最后一列的右边有那个丑陋的未使用区域呢?

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

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

  
      
  1. 水平和垂直滚动条。
  2.   

这是一个小小的让步,但是当最后一列设置为填充时,您将不需要水平条。当它设置为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);
}