【问题标题】:Strange behaviour on DataGridView, focused cells do not scroll horizontallyDataGridView 上的奇怪行为,焦点单元格不水平滚动
【发布时间】:2014-01-12 02:21:39
【问题描述】:

试试这个...
创建Form1,不改变大小,添加一个dataGridView1并将其锚点设置为左上右,然后...

public class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        dataGridView1.AutoGenerateColumns = true;
        var source = new BindingList<Comic>(GetComics());
        dataGridView1.DataSource = source;
    }

    private List<Comic> GetComics()
    {
        var comics = new List<Comic>();

        comics.Add(new Comic() { id = "1", title = "IronMan", editr = "LayneBooks", pages = 65, owned = true });
        comics.Add(new Comic() { id = "2", title = "The Hulk", editr = "LayneBooks", pages = 48, owned = false });
        comics.Add(new Comic() { id = "3", title = "Superman", editr = "DCCore", pages = 72, owned = true });

        return comics;
    }

    // Custom class, source for grid
    private class Comic
    {
        public string id { get; set; }
        public string title { get; set; }
        public string editr { get; set; }
        public int pages { get; set; }
        public bool owned { get; set; }
    }

正如我们所知,我们可以使用箭头键或 Tab 键(当 StandardTab = false 时)从一个单元格转到另一个单元格,然后使用 Ctrl + 箭头键到达网格角落。

这段代码一切正常,单元格被聚焦并用键选择,但是当手动更改列宽时,不可见的单元格被聚焦,但不显示。

例如,使用上面的代码,如果将第一列和第二列的宽度缩小到其原始大小的 20 - 30%,则按 Ctrl + 右键时无法到达右上角。
如果第三列宽度也减小了,并且我们尝试使用右键(或 Tab)到达最后一列,则单元格被聚焦,但没有完全(或绝对)显示。

如何解决这个问题?更改列宽并获得与自动生成时相同的行为。有没有我遗漏的财产? 我的目标是使用按键浏览单元格,并在按下 Keys.Apps 时显示上下文菜单,但如果单元格不可见,则无法执行此操作。

谢谢!

【问题讨论】:

    标签: c# datagridview width datagridviewcolumn


    【解决方案1】:

    没有解决此行为的属性。

    请试试这个代码。

    public Form1()
    {
        InitializeComponent();
    
        dataGridView1.AutoGenerateColumns = true;
        var source = new BindingList<Comic>(GetComics());
        dataGridView1.DataSource = source;
        dataGridView1.CurrentCellChanged += dataGridView1_CurrentCellChanged;
    }
    
    private void dataGridView1_CurrentCellChanged(object sender, EventArgs e)
    {
        if (Control.MouseButtons.HasFlag(MouseButtons.Left)) return;
        var dgv = (DataGridView)sender;
    
        if (dgv.CurrentCell == null) return;
    
        var dispWidth = dgv.ClientSize.Width - dgv.CurrentRow.HeaderCell.Size.Width;
        int columnsWidthSum = 0;
    
        for (int i = dgv.CurrentCell.ColumnIndex; i >= 0; i--)
        {
            columnsWidthSum += dgv.Columns[i].Width;
    
            if (dispWidth >= columnsWidthSum || dispWidth >= dgv.Columns[i].Width)
            {
                dgv.FirstDisplayedScrollingColumnIndex = i;
                break;
            }
        }
    }
    

    【讨论】:

    • 谢谢,它可以工作,但是单击中间的单元格并移动到网格的开头很烦人。我想知道为什么会这样?
    • 我添加了一行来解决点击问题。
    【解决方案2】:

    非常感谢 user3093781 的回答。 我的回答是基于你的。

    这段代码对我有用。

         private void dataGridView_CurrentCellChanged(object sender, EventArgs e) {
    
            if ( Control.MouseButtons.HasFlag(MouseButtons.Left) )
                return;
    
            DataGridView dgv = (DataGridView)sender;
    
            if ( dgv.CurrentCell == null || dgv.Columns.Count == 0 )
                return;
    
            dgv.FirstDisplayedScrollingColumnIndex =
                dgv.FirstDisplayedScrollingColumnIndex > dgv.CurrentCell.ColumnIndex ?
                dgv.CurrentCell.ColumnIndex :
                dgv.FirstDisplayedScrollingColumnIndex 
                ;
        }
    

    【讨论】:

      猜你喜欢
      • 2017-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多