完整代码如下:form上面有两个textbox用来指定行和列的数量,一个button用来create Source table. 一个DataGridView且AutoGenerateColumns=false
public partial class Form1 : Form
public Form1()
InitializeComponent();
DataTable MasterTable = null;//Source table 500 row x 1000 col
int MaskSize = 50; //Load MaskSize*2 Columns every time
int MaskStart = 0; //Display columns start index
int MaskEnd = 0;//Display columns end index
//To Create Source Table, column and Row counts defined by ColCnt and RowCnt from textbox on form
private void createTableButton_Click(object sender, EventArgs e)
int ColCnt = int.Parse(textBox1.Text.Trim());//1000
int RowCnt = int.Parse(textBox2.Text.Trim());//500
//create master source table
MasterTable = new DataTable();
for (int c = 0; c < ColCnt; c++)
MasterTable.Columns.Add("C" + c.ToString(), typeof(float));
for(int r=0;r< RowCnt; r++)
DataRow dr = MasterTable.NewRow();
for (int c = 0; c < ColCnt; c++)
dr["C" + c.ToString()] = r * 1.0 + c*0.01;
MasterTable.Rows.Add(dr);
//initialzie datagriview by loading 0 ~ 100 columns
int LoadStart = MaskStart;
int LoadEnd = MaskSize*1;
if (LoadEnd >= MasterTable.Columns.Count - 1)
LoadEnd = MasterTable.Columns.Count - 1;
//Dynamically create dataGridview columns
for (int i = LoadStart; i <= LoadEnd; i++)
DataGridViewTextBoxColumn dgvc = new DataGridViewTextBoxColumn();
dgvc.DataPropertyName = MasterTable.Columns[i].ColumnName;
dgvc.HeaderText = MasterTable.Columns[i].ColumnName;
dataGridView1.Columns.Add(dgvc);
MaskEnd = i;
//Load subset from SourceTable
dataGridView1.DataSource = MasterTable;
private void Form1_Load(object sender, EventArgs e)
Type t = dataGridView1.GetType();
PropertyInfo pi = t.GetProperty("HorizontalScrollBar", BindingFlags.Instance | BindingFlags.NonPublic);
ScrollBar s = null;
if (pi != null)
s = pi.GetValue(dataGridView1, null) as ScrollBar;
if (s != null)
s.Scroll += new ScrollEventHandler(s_Scroll);
dataGridView1.AutoGenerateColumns = false;
//define horiontal dedegate functoin
void s_Scroll(object sender, ScrollEventArgs e)
HScrollBar HSBar = (HScrollBar)sender;
int HBarWid = HSBar.Width;
int OldValue = e.OldValue;
int NewValue = e.NewValue;
int MaxVal = HSBar.Maximum;
int ScrollVal = HSBar.Value;
StatusLabel1.Text ="Old Value:"+ OldValue.ToString() + ", New Value:"+NewValue.ToString()+ ", Scroll Value:" + ScrollVal.ToString()+", Bar Width:"+ HBarWid.ToString() + ", Max:" + MaxVal.ToString() +", Max_85:"+(0.85 * MaxVal).ToString();
//scroll to end (right) and load next 100 columns
if (NewValue > OldValue && ScrollVal + HBarWid >= MaxVal)
LoadDataToGridView(true);
//scroll to beginning (left) and load previous 100 columns
else if (NewValue < OldValue && ScrollVal <= 0)
LoadDataToGridView(false);
bool DataReload = false;//flag to indicate data just reloaded
void LoadDataToGridView(bool LoadRight)
//Load right, and not reach end of MasterSourceTable
if(LoadRight && MaskEnd != MasterTable.Columns.Count -1)
//clear all dataGridView columns
dataGridView1.Columns.Clear();
//define current loading start
int LoadEnd = MaskEnd + MaskSize;
if(LoadEnd> MasterTable.Columns.Count - 1)
LoadEnd = MasterTable.Columns.Count - 1;
MaskEnd = LoadEnd;
//define current loading end
int LoadStart = MaskEnd - 2 * MaskSize;
if (LoadStart < 0)
LoadStart = 0;
MaskStart = LoadStart;
//create new dataGridColumns to bind current subset of MasterDataTable
for (int i = LoadStart; i <= LoadEnd; i++)
DataGridViewTextBoxColumn dgvc = new DataGridViewTextBoxColumn();
dgvc.DataPropertyName = MasterTable.Columns[i].ColumnName;
dgvc.HeaderText = MasterTable.Columns[i].ColumnName;
dataGridView1.Columns.Add(dgvc);
MaskEnd = i;
dataGridView1.DataSource = MasterTable;
DataReload = true;
//Invalidate dataGridView to trigger re-paint, we can only set scroll bar to center in Paint() event
dataGridView1.Invalidate();
StatusLabel1.Text = "Data columns [" + LoadStart.ToString() + " ~ " + LoadEnd.ToString() + "] loaded.";
//Load Left, not reached beginning of MasterSourceTable
if (!LoadRight && MaskStart != 0)
dataGridView1.Columns.Clear();
int LoadStart = MaskStart - MaskSize;
if (LoadStart < 0)
LoadStart = 0;
MaskStart = LoadStart;
int LoadEnd = LoadStart + 2 * MaskSize;
if (LoadEnd > MasterTable.Columns.Count - 1)
LoadEnd = MasterTable.Columns.Count - 1;
MaskEnd = LoadEnd;
for (int i = LoadStart; i <= LoadEnd; i++)
DataGridViewTextBoxColumn dgvc = new DataGridViewTextBoxColumn();
dgvc.DataPropertyName = MasterTable.Columns[i].ColumnName;
dgvc.HeaderText = MasterTable.Columns[i].ColumnName;
dataGridView1.Columns.Add(dgvc);
MaskEnd = i;
dataGridView1.DataSource = MasterTable;
DataReload = true;
dataGridView1.Invalidate();
StatusLabel1.Text = "Data columns [" + LoadStart.ToString() + " ~ " + LoadEnd.ToString() + "] loaded.";
private void dataGridView1_Paint(object sender, PaintEventArgs e)
if(DataReload)
//if data just re-loaded, set scrollBar to center
DataReload = false;
dataGridView1.FirstDisplayedScrollingColumnIndex = dataGridView1.Columns.Count / 2;
c# winform 中
datagridview
绑定 datatable 以后插入一行记录要20毫秒?求解释,求高效
在C# winform 程序中,先建立了一个
datagridview
用来显示
数据
,
datagridview
的
数据
源是一个datatable(在这里绑定了datatable)。当有新的一行的时候,直接插入datatable。但,当我测试时,发现在将一行新记录(一行有50列
C#,如何提高
DataGridView
控件的显示效率?一次要管理100万条记录,如何才能不卡?不仅仅是虚拟模式的问题。
(1)采用virtualmode,不要使用
datagridview
1.datasource = dt
如何使用虚拟模式,参见https://blog.csdn.net/qq_30122639/article/details/53739607和https://bbs.csdn....
解决过程如下:
1.设置
dataGridView
双buffer代码如下,需要引用反射命名空间
Type dgvType = this.
dataGridView
1.GetType();
PropertyInfo pi = dgvType.GetProperty("DoubleBuffered", BindingFlags.Ins
今天公司需要一个新的内容,通过点击按钮能实现根据combobox内容自动添加两行或者多行,然后使用扫码抢录入
数据
到表格行中,其实一直也想做一个这种的代码,这种的设计在生活中其实很常见 ,完成结果在下图。
可以使用
DataGridView
.FirstDisplayedScrollingRowIndex 属性来设置要滚动到哪一行。例如,要滚动到第 10 行,可以使用以下代码:
dataGridView
1.FirstDisplayedScrollingRowIndex = 9;
或者使用
DataGridView
.CurrentCell 属性来设置当前选中的单元格,并让
DataGridView
自动...