如何在选中时显示整个DataGridViewCell(CellEnter事件)?

时间:2013-12-21 04:19:43

标签: c# winforms datagridview horizontal-scrolling

我正在使用VS 2010和.NET framework 4.0。有没有办法在选中时显示整个DataGridViewCell(矩形)(键不是点击)。 我有一个DataGridView控件有10 - 12列,当没有显示单元格(物理上)到达时,网格不会水平滚动。 我正在使用SelectionMode.FullRowSelectStandardTab = false属性。

网格是只读的,当用户在Keys.Apps上按CurrentCell时,会显示一个上下文菜单,但如果CurrentCell未显示但是已聚焦(带有虚线的矩形) )网格不滚动,菜单不应出现。

我尝试将Frozen = false设置为所有代码生成的列,但没有成功。

也许在dataGridView1_CellEnter事件中,设置当前单元格(所有矩形,而不仅仅是数据)完全显示(如果之前不是)

FirstDisplayedCell属性不完全是我的解决方案)

3 个答案:

答案 0 :(得分:1)

我已经尝试了你所描述的内容,看起来只有使用鼠标才会出现问题,使用Tab键或箭头键会自动将整个单元格聚焦在一起。因此,以下解决方案是处理使用鼠标,允许用户点击部分显示的单元格,然后在此之后显示整个单元格。我们必须处理CellClick事件,使用HorizontalScrollingOffset属性以编程方式滚动水平滚动条,当然我们必须自己计算滚动值:

//CellClick event handler for the dataGridView1
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e){
  var colRect = dataGridView1.GetColumnDisplayRectangle(e.ColumnIndex, false);
  colRect.X = colRect.Right - dataGridView1.Columns[e.ColumnIndex].Width;
  int offSet = colRect.Right - dataGridView1.Width + 
                               SystemInformation.VerticalScrollBarWidth;
  if (offSet < 0) {
     var rowHeaderWidth = !dataGridView1.RowHeadersVisible ? 0 : 
                           dataGridView1.RowHeadersWidth;
     offSet = colRect.Left < rowHeaderWidth ? colRect.Left - rowHeaderWidth : 0;
  }
  dataGridView1.HorizontalScrollingOffset += offSet;
}

更新:对于使用键处理聚焦,您可以尝试处理CellEnter,但上述所有代码仍然有用:

private void dataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e){
  //your problem happens only when ReadOnly is true, so 
  //we just need to handle it when ReadOnly is true
  if(!dataGridView1.ReadOnly) return;
  //the remaining code... 
  //....
}

答案 1 :(得分:0)

尝试使用此属性设置。

RowHeadersWidthSizeMode=AutoSizeToDisplayedHeaders;

答案 2 :(得分:0)

您在网格中设置属性

AutoSizeColumnModeAllCells

它可以帮助你。