【问题标题】:How to show entire DataGridViewCell when selected (CellEnter event)?选择时如何显示整个 DataGridViewCell(CellEnter 事件)?
【发布时间】:2014-01-10 00:11:28
【问题描述】:

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

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

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

可能在dataGridView1_CellEnter 事件中,将当前单元格(所有矩形,不仅仅是数据)设置为完全显示(如果之前没有的话)

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

【问题讨论】:

    标签: c# winforms datagridview horizontal-scrolling


    【解决方案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... 
      //....
    }
    

    【讨论】:

    • 我刚刚编辑了这个问题,我的意思是当单元格用键而不是点击聚焦时。我很抱歉。无论如何,我会保留你的代码,看起来很有趣,只是给了我一些考虑的想法,谢谢。
    • @mck 看我的更新,很简单,不用处理CellClick,你可以处理CellEnter 事件,我贴的所有代码还是有用的。
    • 这个问题发生在ReadOnly真或假,你的代码没问题,但是如果你用Ctrl +右箭头键转到最后一个单元格,colRect将是一个0x0矩形..
    • @mck 我现在什至不确定您的问题是否存在,我已经尝试过几次并且确实存在但不知何故,默认情况下它可以正常工作(不要使用任何代码),TAB 和 Arrow 键可以按您的意愿工作。这很奇怪,看起来这是一个错误,在 DataGridView 中不是很严重的错误。无论如何我的代码工作正常,我不明白为什么你认为跳到最后一个单元格会导致colRect 是一个空矩形,请注意GetColumnDisplayRectangle 根据第二个参数(@ 类型)以两种不同的方式工作987654334@).
    • 运行你的代码,最后一列由于间距不可见,按Ctrl+右箭头,GetColumnDisplayRectangle返回一个空矩形,我确定没有测试,如果真的是一个错误,我很惊讶这之前没有讨论过,无论如何谢谢
    【解决方案2】:

    你在网格中设置了一个属性

    AutoSizeColumnMode 为AllCells

    它可以帮助你。

    【讨论】:

      【解决方案3】:

      试试这个属性设置。

      RowHeadersWidthSizeMode=AutoSizeToDisplayedHeaders;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-03
        • 1970-01-01
        • 2011-12-26
        • 1970-01-01
        相关资源
        最近更新 更多