解决方案 »

  1.   

    本帖最后由 bdmh 于 2014-05-14 15:00:17 编辑
      

  2.   

    参考版主写的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; }
           }
        }
      

  3.   

    哥们你这都直接把tt绑定到DataGridView中去了,那就不用虚模式加载了。
      

  4.   


    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; }
           }
        }
      

  5.   

    如果你是把DataTable一次性加载到内存,再谈虚模式是毫无意义的。你的慢应该不是DGV绑定数据慢,而是从EXCEL加载得慢。
    DGV显示数据的性能还是可以的,几万条应该不在话下。
    建议你优化一下从EXCEL读数据的过程,不需要用NPOI,直接把EXCEL当数据库来连,用Jet.OleDB所谓虚模式,实际是分部加载。一次只加载少量当前用户看得到的数据。这涉及到数据库的分页查询,还有DGV的显示模式。
    如果完全自己写,估计没几百行代码搞不定。