怎么把读取到datatable中的数据用虚模式的方式在DataGridView上实现? DataGridView虚模式 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 本帖最后由 bdmh 于 2014-05-14 15:00:17 编辑 参考版主写的this.dataGridView1.VirtualMode = true; this.dataGridView1.ReadOnly = true; this.dataGridView1.AllowUserToAddRows = false; this.dataGridView1.AllowUserToDeleteRows = false;this.dataGridView1.DataSource = tt; this.dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;private void InitData() { for (int i = 0; i < tt.Rows.Count; i++) { m_Visited.Add(false); DataObject obj = new DataObject(); obj.Id = i; //看你结点的类型了 obj.Val = tt.Columns["节点"]; m_Data.Add(obj); } }public class DataObject { private int m_Id; private int m_Val; public int Val { get { return m_Val; } set { m_Val = value; } } public int Id { get { return m_Id; } set { m_Id = value; } } } 哥们你这都直接把tt绑定到DataGridView中去了,那就不用虚模式加载了。 public partial class Form1 : Form { private List<DataObject> m_Data = new List<DataObject>(); private List<bool> m_Visited = new List<bool>(); private DataTable tt; public Form1() { InitializeComponent(); dataGridView1.CellValueNeeded += OnCellValueNeeded; m_GetVisitedCountButton.Click += OnGetVisitedCount; InitData(); InitGrid(); } private void Form1_Load(object sender, EventArgs e) { } private void InitData() { tt = new System.Data.DataTable(); tt = NPOIHandler.ExcelToDataTable(openDlg.FileName, "数据表"); tt.Columns.Add("节点"); tt.Columns["节点"].SetOrdinal(19); this.Text = openDlg.FileName; excelName = this.Text; if (tt == null) { return; } for (int i = 0; i < tt.Rows .Count+1 ; i++) { m_Visited.Add(false); DataObject obj = new DataObject(); obj.Id = i; //change Val type obj.Val = Convert.ToInt32(tt.Columns["节点"].ToString ()); m_Data.Add(obj); } } private void InitGrid() { dataGridView1.Columns.Clear(); dataGridView1.VirtualMode = true; dataGridView1.ReadOnly = true; dataGridView1.AllowUserToAddRows = false; dataGridView1.AllowUserToDeleteRows = false; dataGridView1.ColumnCount = 3; dataGridView1.Rows.Add(); dataGridView1.Rows.AddCopies(0, tt.Rows.Count); // Uncomment the next line and comment out the // the rest of the method to switch to data bound mode //m_Grid.DataSource = m_Data; } private void OnCellValueNeeded(object sender, DataGridViewCellValueEventArgs e) { m_Visited[e.RowIndex] = true; if (e.ColumnIndex == 0) { e.Value = m_Data[e.RowIndex].Id; } else if (e.ColumnIndex == 1) { e.Value = m_Data[e.RowIndex].Val; } else if (e.ColumnIndex == 2) { Random rand = new Random(); e.Value = rand.Next(); } } private void OnGetVisitedCount(object sender, EventArgs e) { int count = 0; foreach (bool b in m_Visited) { if (b) count++; } MessageBox.Show(count.ToString()); } } public class DataObject { private int m_Id; private int m_Val; public int Val { get { return m_Val; } set { m_Val = value; } } public int Id { get { return m_Id; } set { m_Id = value; } } } 如果你是把DataTable一次性加载到内存,再谈虚模式是毫无意义的。你的慢应该不是DGV绑定数据慢,而是从EXCEL加载得慢。DGV显示数据的性能还是可以的,几万条应该不在话下。建议你优化一下从EXCEL读数据的过程,不需要用NPOI,直接把EXCEL当数据库来连,用Jet.OleDB所谓虚模式,实际是分部加载。一次只加载少量当前用户看得到的数据。这涉及到数据库的分页查询,还有DGV的显示模式。如果完全自己写,估计没几百行代码搞不定。 数字正方形 asp.net里 怎么让点击找不到的页的时候 转向友情提示页面 DevExpress.XtraReports.UI.XtraReport 绑定不上数据源 急!!! 更改项目名称 关于 RichTextBox 控件 急用 我是个菜鸟,请问什么叫b/s 跟c/s C# 导入oracle数据库。dmp文件 急,在线等啊! 可否将windows控件类做成一个远程处理类呢? 2003.net打开.net的程序,报表显示特别慢?? SerialPort使用BaseStream异步读取数据问题 C#的directx3d开发,摄像机旋转问题,无法垂直转过90度
this.dataGridView1.ReadOnly = true;
this.dataGridView1.AllowUserToAddRows = false;
this.dataGridView1.AllowUserToDeleteRows = false;
this.dataGridView1.DataSource = tt;
this.dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;private void InitData()
{
for (int i = 0; i < tt.Rows.Count; i++)
{
m_Visited.Add(false);
DataObject obj = new DataObject();
obj.Id = i;
//看你结点的类型了
obj.Val = tt.Columns["节点"];
m_Data.Add(obj);
}
}public class DataObject
{
private int m_Id;
private int m_Val;
public int Val
{
get { return m_Val; }
set { m_Val = value; }
}
public int Id
{
get { return m_Id; }
set { m_Id = value; }
}
}
public partial class Form1 : Form
{
private List<DataObject> m_Data = new List<DataObject>();
private List<bool> m_Visited = new List<bool>();
private DataTable tt; public Form1()
{
InitializeComponent();
dataGridView1.CellValueNeeded += OnCellValueNeeded;
m_GetVisitedCountButton.Click += OnGetVisitedCount;
InitData();
InitGrid();
} private void Form1_Load(object sender, EventArgs e)
{ }
private void InitData()
{
tt = new System.Data.DataTable();
tt = NPOIHandler.ExcelToDataTable(openDlg.FileName, "数据表");
tt.Columns.Add("节点");
tt.Columns["节点"].SetOrdinal(19);
this.Text = openDlg.FileName;
excelName = this.Text;
if (tt == null) { return; }
for (int i = 0; i < tt.Rows .Count+1 ; i++)
{
m_Visited.Add(false);
DataObject obj = new DataObject();
obj.Id = i;
//change Val type
obj.Val = Convert.ToInt32(tt.Columns["节点"].ToString ());
m_Data.Add(obj);
}
}
private void InitGrid()
{
dataGridView1.Columns.Clear();
dataGridView1.VirtualMode = true;
dataGridView1.ReadOnly = true;
dataGridView1.AllowUserToAddRows = false;
dataGridView1.AllowUserToDeleteRows = false;
dataGridView1.ColumnCount = 3;
dataGridView1.Rows.Add();
dataGridView1.Rows.AddCopies(0, tt.Rows.Count);
// Uncomment the next line and comment out the
// the rest of the method to switch to data bound mode
//m_Grid.DataSource = m_Data;
}
private void OnCellValueNeeded(object sender,
DataGridViewCellValueEventArgs e)
{
m_Visited[e.RowIndex] = true;
if (e.ColumnIndex == 0)
{
e.Value = m_Data[e.RowIndex].Id;
}
else if (e.ColumnIndex == 1)
{
e.Value = m_Data[e.RowIndex].Val;
}
else if (e.ColumnIndex == 2)
{
Random rand = new Random();
e.Value = rand.Next();
}
}
private void OnGetVisitedCount(object sender, EventArgs e)
{
int count = 0;
foreach (bool b in m_Visited)
{
if (b) count++;
}
MessageBox.Show(count.ToString());
}
}
public class DataObject
{
private int m_Id;
private int m_Val;
public int Val
{
get { return m_Val; }
set { m_Val = value; }
}
public int Id
{
get { return m_Id; }
set { m_Id = value; }
}
}
DGV显示数据的性能还是可以的,几万条应该不在话下。
建议你优化一下从EXCEL读数据的过程,不需要用NPOI,直接把EXCEL当数据库来连,用Jet.OleDB所谓虚模式,实际是分部加载。一次只加载少量当前用户看得到的数据。这涉及到数据库的分页查询,还有DGV的显示模式。
如果完全自己写,估计没几百行代码搞不定。