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