完整代码如下: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 自动...