DataGridView dgv = new DataGridView();
             dgv.Size = new Size(200, 200);
           
             dgv.Location = new Point(0, 30);
            
             OleDbConnection conn = new OleDbConnection(connString);
           
             conn.Open();
           
            string sqlstrr = @"select * from bxxd";             OleDbDataAdapter da = new OleDbDataAdapter(sqlstrr, conn);             DataSet ds = new DataSet();             da.Fill(ds, "bxxd");
             dgv.Columns[0].HeaderText = "单号";
             dgv.Columns[1].HeaderText = "名称";
             dgv.Columns[2].HeaderText = "型号";
             dgv.Columns[3].HeaderText = "单价";
             dgv.Columns[4].HeaderText = "数量";
             dgv.Columns[5].HeaderText = "日期";
             dgv.Columns[6].HeaderText = "tttt";
             dgv.AutoGenerateColumns = true;
             dgv.DataSource = ds.Tables["bxxd"];
             this.Controls.Add(dgv);运行时在 dgv.Columns[0].HeaderText = "单号";处出错“索引超出范围。必须为非负值并小于集合大小。参数名: index”
将这几句定义的列标题注释掉,表按字段名可以显示,将dgv.AutoGenerateColumns = true;值改为false.同样出错。
如果是从工具箱中拖出的dataGridView,同样的代码却可以通过,自定义的列标题能显示。真的不明白,为什么动态生成的控件,这样定义的列标题不能显示。拖出的却能显示。是错在那里,还请高手指出。用的是VS2008

解决方案 »

  1.   

    编译时它怎么知道你的DataSource有多少列
      

  2.   

    dgv.Columns[0]
    dgv.Columns[0]
    ....
    放到
    DataSource=ds.Tables["bxxd"];
    dgv.DataBind();
    下面试试~
      

  3.   

    dgv.Columns[0]
    dgv.Columns[0]
    ....
    放到
    DataSource=ds.Tables["bxxd"];
    dgv.DataBind();
    下面试试~ 
     
     
     
    试过了,不行
      

  4.   

    在查询语句的地方修改,然后直接绑定就行了。DataGridView dgv = new DataGridView();
                 dgv.Size = new Size(200, 200);
               
                 dgv.Location = new Point(0, 30);
                
                 OleDbConnection conn = new OleDbConnection(connString);
               
                 conn.Open();
               
                string sqlstrr = @"select xx as 单号,xx as 名称,....,xx as tttt from bxxd";             OleDbDataAdapter da = new OleDbDataAdapter(sqlstrr, conn);             DataSet ds = new DataSet();             da.Fill(ds, "bxxd");
                 'dgv.Columns[0].HeaderText = "单号";
                 'dgv.Columns[1].HeaderText = "名称";
                 'dgv.Columns[2].HeaderText = "型号";
                 'dgv.Columns[3].HeaderText = "单价";
                 'dgv.Columns[4].HeaderText = "数量";
                 'dgv.Columns[5].HeaderText = "日期";
                 'dgv.Columns[6].HeaderText = "tttt";
                 dgv.AutoGenerateColumns = true;
                 dgv.DataSource = ds.Tables["bxxd"];
                 this.Controls.Add(dgv);
      

  5.   

    DataGridView dgv = new DataGridView();
                 dgv.Size = new Size(200, 200);
               
                 dgv.Location = new Point(0, 30);
                
                 OleDbConnection conn = new OleDbConnection(connString);
               
                 conn.Open();
               
                string sqlstrr = @"select * from bxxd";             OleDbDataAdapter da = new OleDbDataAdapter(sqlstrr, conn);             DataSet ds = new DataSet();
                 da.Fill(ds, "bxxd");
                 dgv.AutoGenerateColumns = true;
                 dgv.DataSource = ds.Tables["bxxd"];
                 dgv.Columns[0].HeaderText = "单号";
                 dgv.Columns[1].HeaderText = "名称";
                 dgv.Columns[2].HeaderText = "型号";
                 dgv.Columns[3].HeaderText = "单价";
                 dgv.Columns[4].HeaderText = "数量";
                 dgv.Columns[5].HeaderText = "日期";
                 dgv.Columns[6].HeaderText = "tttt";
                 this.Controls.Add(dgv);
    调整了一下顺序,试试看
      

  6.   

    你在手动托的时候看designer.cs的文件了么?
    你看看 那后面生成了多少 DataGridViewRow的对象,然后把这些对象都加入到那个DataGridView中了
    你自己这个所谓动态的  就没有上面的操作 
    虽说那个文件是最好不要改的 但是里面的代码还是要看看的  至少知道  咱手动托控件的时候  微软自动生成了多少东西 
    你想动态的话 那么这些对象你也得生成出来了  按照它自动生成的写法 写到你动态添加的代码那块
      

  7.   

    1、代码指定列头与绑定datagridview 顺序调整一下;
    2、你的错误在于datagridview 在初始化后,并没有生成对应的Columns 集合,这样就去绑定,是错误的
    3、待调整完顺序后,将this.AutoGenerateColumns = false;
    4、并保证你的select * from table 的查询结果仅有7列;
      

  8.   


            this.SuspendLayout();
            private System.Windows.Forms.DataGridViewTextBoxColumn Column1;
            private System.Windows.Forms.DataGridViewTextBoxColumn Column2;
            private System.Windows.Forms.DataGridViewTextBoxColumn Column3;
            private System.Windows.Forms.DataGridViewTextBoxColumn Column4;
            private System.Windows.Forms.DataGridViewTextBoxColumn Column5;
            private System.Windows.Forms.DataGridViewTextBoxColumn Column6;            // 
                // Column1
                // 
                this.Column1.HeaderText = "Column1";
                this.Column1.Name = "Column1";
                // 
                // Column2
                // 
                this.Column2.HeaderText = "Column2";
                this.Column2.Name = "Column2";
                // 
                // Column3
                // 
                this.Column3.HeaderText = "Column3";
                this.Column3.Name = "Column3";
                // 
                // Column4
                // 
                this.Column4.HeaderText = "Column4";
                this.Column4.Name = "Column4";
                // 
                // Column5
                // 
                this.Column5.HeaderText = "Column5";
                this.Column5.Name = "Column5";
                // 
                // Column6
                // 
                this.Column6.HeaderText = "Column6";
                this.Column6.Name = "Column6";
                // 
                // frm_DataGridView
                //           this.dataGridView1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
                this.Column1,
                this.Column2,
                this.Column3,
                this.Column4,
                this.Column5,
                this.Column6});
             this.ResumeLayout(false);上述原来动态生成的代码  现在就是你要动态添加的代码
      

  9.   

    将dgv.AutoGenerateColumns = true;改成dgv.AutoGenerateColumns = false;
      

  10.   

     string sqlstrr = @"select xx as 单号,xx as 名称,....,xx as tttt from bxxd";             OleDbDataAdapter da = new OleDbDataAdapter(sqlstrr, conn);             DataSet ds = new DataSet();             da.Fill(ds, "bxxd");
                 'dgv.Columns[0].HeaderText = "单号";
    .......
    在查询语句中as是可以,不过我那样做为什么不行?
      

  11.   

    对,按9楼的说法,先得动态添加列到GridView
      

  12.   

    先谢谢大家,5楼的方法可行,9楼的方法没有试,因要是将列标题设成字符串数组,循环赋值如
    string[] str = new string[] { "a", "b", "c"}
    for(int i=0;i<7;i++)
    {
       
    dgv.Columns[i].HeaderText = str[i];
    }
    也是一样的错误;