C# DataGridView出现滚动条显示问题 我现在有一些数据,条数不定,我现在要做的就是不管窗体显示多大,根据窗体的大小,判断DataGridView是否出现滚动条,如果出现滚动条,就把剩下的数据显示在另一个DataGridView中,以此类推 具体实现怎么实现, 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这是datagridview替换系统滚动条的代码,看懂这个实现你那个不难private void SetupScrollBars() { // Vertical Scroll Bar Replacement Type t = typeof(System.Windows.Forms.DataGridView); FieldInfo fi = t.GetField("vertScrollBar", BindingFlags.NonPublic | BindingFlags.Instance); if (fi == null) return; System.Windows.Forms.ScrollBar sb = fi.GetValue(this) as System.Windows.Forms.ScrollBar; if (sb == null) return; //sb.Scroll += new ScrollEventHandler(sb_Scroll); return; MethodInfo mi = t.GetMethod("DataGridViewVScrolled", BindingFlags.NonPublic | BindingFlags.Instance); if (mi == null) return; VScrollBarEx newVSb = new VScrollBarEx(); //newVSb.Minimum = sb.Minimum; //newVSb.Maximum = sb.Maximum; //newVSb.SmallChange = sb.SmallChange; //newVSb.LargeChange = sb.LargeChange; //newVSb.Top = sb.Top; //newVSb.AccessibleName = sb.AccessibleName; //newVSb.Left = sb.Left; //newVSb.Visible = sb.Visible; newVSb.Scroll += (ScrollEventHandler)ScrollEventHandler.CreateDelegate(typeof(ScrollEventHandler), this, mi); fi.SetValue(this, newVSb); sb.Dispose(); this.Controls.Remove(sb); this.Controls.Add(newVSb); // Horizontal Scroll Bar Replacement fi = t.GetField("horizScrollBar", BindingFlags.NonPublic | BindingFlags.Instance); if (fi == null) return; sb = fi.GetValue(this) as System.Windows.Forms.ScrollBar; if (sb == null) return; mi = t.GetMethod("DataGridViewHScrolled", BindingFlags.NonPublic | BindingFlags.Instance); if (mi == null) return; HScrollBarEx newHSb = new HScrollBarEx(); //newHSb.Minimum = sb.Minimum; //newHSb.Maximum = sb.Maximum; //newHSb.SmallChange = sb.SmallChange; //newHSb.LargeChange = sb.LargeChange; //newHSb.Top = sb.Top; //newHSb.AccessibleName = sb.AccessibleName; //newHSb.Left = sb.Left; //newHSb.Visible = sb.Visible; //newHSb.RightToLeft = sb.RightToLeft; newHSb.Scroll += (ScrollEventHandler)ScrollEventHandler.CreateDelegate(typeof(ScrollEventHandler), this, mi); fi.SetValue(this, newHSb); sb.Dispose(); this.Controls.Remove(sb); this.Controls.Add(newHSb); } 给你一些应该有帮助的代码。1 当前展示的第一行 2 是否出现滚动条var rowBandInfo = typeof(DataGridView).GetField("displayedBandsInfo", BindingFlags.Instance | BindingFlags.NonPublic); if (rowBandInfo != null) { var val = rowBandInfo.GetValue(dataGridView1);//获取显示的第一行 var firstDisplayedScrollingRow = (int)rowBandInfo.FieldType.GetProperty("FirstDisplayedScrollingRow", BindingFlags.Instance | BindingFlags.Public).GetValue(val, null);}if(dataGridView1.DisplayedRowCount(true)<dataGridView1.Rows.Count)//出现滚动条 { } 很简单,一旦有滚动条必然那一行的值无法在屏幕可见foreach (DataGridViewRow dgrv in dataGridView1.Rows){ if (!dgrv.Displayed) { string v = dgrv.Cells["ColumnName"].Value.ToString();//获取列值 //还可以知道索引 } break;} 计算所有行高和datagridview1.Rows.Count * 行高看是否大于 datagridview1的Height - 标题栏高度行高、标题栏高度 都可以知道 但是怎么样把剩下的数据显示在另一个DataGridView里面,在第二个dgv显示不了的话,把剩下的数据在显示到第三个DataGridView里面 说道这个份上应该会解决了啊,既然你都知道了哪一行开始应该到另一个dgv,那就把数据源相应的索引之后的数据分到另一个dgv就可以了,那就这么解决啊! 想用C#编写一个操作excel软件 发贴请教两个关于datagridView的问题 如何根据textbox或combobox等控件的值来生成1个配置文件 文件读取和编码的问题,总是不不能读取文件最开始的两个字节(50分)。 数据排列 【求代码】刚才看见论坛里有人发进销存软件的代码,谁能发给我一下吗?谢谢 正则表达式 <<<界面登陆问题>>> 关于亚马逊MWS API开发的,有在做一块的吗? 大师,如何获取路由器的动态IP地址,这个地址是由ISP动态分配的。 winform下的画曲线程序 正则表达式
{
// Vertical Scroll Bar Replacement
Type t = typeof(System.Windows.Forms.DataGridView);
FieldInfo fi = t.GetField("vertScrollBar", BindingFlags.NonPublic | BindingFlags.Instance);
if (fi == null) return;
System.Windows.Forms.ScrollBar sb = fi.GetValue(this) as System.Windows.Forms.ScrollBar;
if (sb == null) return;
//sb.Scroll += new ScrollEventHandler(sb_Scroll); return;
MethodInfo mi = t.GetMethod("DataGridViewVScrolled", BindingFlags.NonPublic | BindingFlags.Instance);
if (mi == null) return;
VScrollBarEx newVSb = new VScrollBarEx();
//newVSb.Minimum = sb.Minimum;
//newVSb.Maximum = sb.Maximum;
//newVSb.SmallChange = sb.SmallChange;
//newVSb.LargeChange = sb.LargeChange;
//newVSb.Top = sb.Top;
//newVSb.AccessibleName = sb.AccessibleName;
//newVSb.Left = sb.Left;
//newVSb.Visible = sb.Visible;
newVSb.Scroll += (ScrollEventHandler)ScrollEventHandler.CreateDelegate(typeof(ScrollEventHandler), this, mi);
fi.SetValue(this, newVSb);
sb.Dispose();
this.Controls.Remove(sb);
this.Controls.Add(newVSb); // Horizontal Scroll Bar Replacement
fi = t.GetField("horizScrollBar", BindingFlags.NonPublic | BindingFlags.Instance);
if (fi == null) return;
sb = fi.GetValue(this) as System.Windows.Forms.ScrollBar;
if (sb == null) return;
mi = t.GetMethod("DataGridViewHScrolled", BindingFlags.NonPublic | BindingFlags.Instance);
if (mi == null) return; HScrollBarEx newHSb = new HScrollBarEx();
//newHSb.Minimum = sb.Minimum;
//newHSb.Maximum = sb.Maximum;
//newHSb.SmallChange = sb.SmallChange;
//newHSb.LargeChange = sb.LargeChange;
//newHSb.Top = sb.Top;
//newHSb.AccessibleName = sb.AccessibleName;
//newHSb.Left = sb.Left;
//newHSb.Visible = sb.Visible;
//newHSb.RightToLeft = sb.RightToLeft;
newHSb.Scroll += (ScrollEventHandler)ScrollEventHandler.CreateDelegate(typeof(ScrollEventHandler), this, mi);
fi.SetValue(this, newHSb);
sb.Dispose();
this.Controls.Remove(sb);
this.Controls.Add(newHSb);
}
1 当前展示的第一行 2 是否出现滚动条var rowBandInfo = typeof(DataGridView).GetField("displayedBandsInfo", BindingFlags.Instance | BindingFlags.NonPublic);
if (rowBandInfo != null)
{
var val = rowBandInfo.GetValue(dataGridView1);
//获取显示的第一行
var firstDisplayedScrollingRow = (int)rowBandInfo.FieldType.GetProperty("FirstDisplayedScrollingRow", BindingFlags.Instance | BindingFlags.Public).GetValue(val, null);
}if(dataGridView1.DisplayedRowCount(true)<dataGridView1.Rows.Count)//出现滚动条
{ }
foreach (DataGridViewRow dgrv in dataGridView1.Rows)
{
if (!dgrv.Displayed)
{
string v = dgrv.Cells["ColumnName"].Value.ToString();//获取列值
//还可以知道索引
}
break;
}
datagridview1.Rows.Count * 行高
看是否大于 datagridview1的Height - 标题栏高度行高、标题栏高度 都可以知道