Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DataGridView上的奇怪行为,聚焦单元格不会水平滚动_C#_Datagridview_Width_Datagridviewcolumn - Fatal编程技术网

C# DataGridView上的奇怪行为,聚焦单元格不会水平滚动

C# DataGridView上的奇怪行为,聚焦单元格不会水平滚动,c#,datagridview,width,datagridviewcolumn,C#,Datagridview,Width,Datagridviewcolumn,试试这个… 创建Form1,不更改大小,添加dataGridView1并将其定位点设置为左、上、右,然后 public class Form1 : Form { public Form1() { InitializeComponent(); dataGridView1.AutoGenerateColumns = true; var source = new BindingList<Comic>(GetComics())

试试这个…
创建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; }
    }
公共类表单1:表单
{
公共表格1()
{
初始化组件();
dataGridView1.AutoGenerateColumns=true;
var source=newbindingslist(GetComics());
dataGridView1.DataSource=源;
}
私有列表GetComics()
{
var comics=新列表();
添加(新漫画(){id=“1”,title=“IronMan”,editor=“LayneBooks”,pages=65,owned=true});
添加(new Comic(){id=“2”,title=“The Hulk”,editor=“LayneBooks”,pages=48,owned=false});
添加(新漫画(){id=“3”,title=“Superman”,editor=“DCCore”,pages=72,owned=true});
回归漫画;
}
//自定义类,网格的源
私人班漫画
{
公共字符串id{get;set;}
公共字符串标题{get;set;}
公共字符串编辑器{get;set;}
公共整型页{get;set;}
公共布尔拥有{get;set;}
}
正如我们所知,我们可以使用箭头键或Tab键(当
StandardTab=false
时)从一个单元格转到另一个单元格,并使用Ctrl+箭头键到达网格角

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

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

如何解决这个问题?更改列宽并获得与自动生成时相同的beahviour。是否缺少任何属性?。 我的目标是使用键在单元格中导航,并在按下
键时显示上下文菜单。Apps
,但如果单元格不可见,则无法执行此操作


谢谢!

没有解决此行为的属性

请尝试此代码

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;
        }
    }
}
public Form1()
{
初始化组件();
dataGridView1.AutoGenerateColumns=true;
var source=newbindingslist(GetComics());
dataGridView1.DataSource=源;
dataGridView1.CurrentCellChanged+=dataGridView1\u CurrentCellChanged;
}
私有void dataGridView1\u CurrentCellChanged(对象发送方,事件参数e)
{
if(Control.MouseButtons.HasFlag(MouseButtons.Left))返回;
var dgv=(DataGridView)发送方;
if(dgv.CurrentCell==null)返回;
var dispWidth=dgv.ClientSize.Width-dgv.CurrentRow.HeaderCell.Size.Width;
int columnsWidthSum=0;
对于(int i=dgv.CurrentCell.ColumnIndex;i>=0;i--)
{
columnsWidthSum+=dgv.Columns[i].宽度;
if(dispWidth>=columnsWidthSum | | dispWidth>=dgv.Columns[i].Width)
{
dgv.FirstDisplayedScrollingColumnIndex=i;
打破
}
}
}

非常感谢用户3093781的回答。 我的答案是以你的为基础的

这个代码对我有用

     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 
            ;
    }

谢谢,它很有效,但是在中间点击一个单元格很烦人,它移动到网格的开头。我想知道为什么会发生这种情况?我添加了一条线来解决这个问题。