列计数属性不能在数据绑定的datagridview控件上设置c# [英] column count property cannot be set on a databound datagridview control c#

查看:156
本文介绍了列计数属性不能在数据绑定的datagridview控件上设置c#的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的表单中我有一个DataGridView。并控制输入和输出数据。同时在网格视图中显示数据。我在两次呼叫BindGrid。一个formload等添加一个新的记录。

  public formAccounts()
{
InitializeComponent();
BindGrid();
}

private void BindGrid()
{
OleDbConnection conn = new OleDbConnection();
conn.ConnectionString = @Provider = Microsoft.Jet.OLEDB.4.0; Data Source = G:\Sanjeev\TESTDB\DB.mdb; Jet OLEDB:数据库密码= Test123; Jet OLEDB:引擎类型= 5;
conn.Open();
string constring = @Provider = Microsoft.Jet.OLEDB.4.0; Data Source = G:\Sanjeev\TESTDB\DB.mdb; Jet OLEDB:Database Password = Test123; Jet OLEDB:Engine Type = 5;

using(OleDbConnection con = new OleDbConnection(constring))
{
using(OleDbCommand cmd = new OleDbCommand(SELECT * FROM tblAccounts,con))
{
cmd.CommandType = CommandType.Text;
using(OleDbDataAdapter sda = new OleDbDataAdapter(cmd))
{
using(DataTable dt = new DataTable())
{
sda.Fill(dt);
//设置AutoGenerateColumns False
dtGrdAccounts.AutoGenerateColumns = false;
//设置列计数
*** dtGrdAccounts.ColumnCount = 3; ***
//添加列
dtGrdAccounts.Columns [0] .Name =AccountID;
dtGrdAccounts.Columns [0] .HeaderText =Id;
dtGrdAccounts.Columns [0] .DataPropertyName =AccID;

dtGrdAccounts.Columns [1] .HeaderText =帐户名称;
dtGrdAccounts.Columns [1] .Name =帐户名称;
dtGrdAccounts.Columns [1] .DataPropertyName =AccName;

dtGrdAccounts.Columns [2] .Name =AccountNumber;
dtGrdAccounts.Columns [2] .HeaderText =帐号;
dtGrdAccounts.Columns [2] .DataPropertyName =AccNumber
dtGrdAccounts.DataSource = dt;
}
}
}
}
}

如果我删除行 dtGrdAccounts.ColumnCount = 3; 我正在下错误。
索引超出范围。必须是非负数且小于集合的大小。
参数名称:索引



添加新记录后,On按钮保存我正在调用BindGrid()方法来获取记录在GridiView中。

  string cmdText =prAddAccounts; 
OleDbCommand cmd = new OleDbCommand(cmdText,conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue(AccName,txtAccName.Text.ToString());
// .....其他参数插入记录.....
OleDbCommand cmd = new OleDbCommand(cmdText,conn);
cmd.CommandType = CommandType.StoredProcedure;
OleDbDataReader reader = cmd.ExecuteReader();
BindGrid();


解决方案

问题是当您调用 BindGrid()再次你必须先清除它:

  string cmdText =prAddAccounts ; 
OleDbCommand cmd = new OleDbCommand(cmdText,conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue(AccName,txtAccName.Text.ToString());
// .....其他参数插入记录.....

//清除绑定。
dtGrdAccounts.DataSource = null;
//绑定新数据。
BindGrid();


In My form I have a DataGridView. and controls for input and output data. while displaying data in the gird view. I am calling BindGrid in two occasions. One while formload and other is After adding a new record.

 public formAccounts()
    {
        InitializeComponent();
        BindGrid();           
    }

 private void BindGrid()
    {
        OleDbConnection conn = new OleDbConnection();
        conn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source= G:\Sanjeev\TESTDB\DB.mdb;Jet OLEDB:Database Password=Test123; Jet OLEDB:Engine Type=5";
        conn.Open();
        string constring = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=G:\Sanjeev\TESTDB\DB.mdb;Jet OLEDB:Database Password=Test123; Jet OLEDB:Engine Type=5";

        using (OleDbConnection con = new OleDbConnection(constring))
        {
            using (OleDbCommand cmd = new OleDbCommand("SELECT * FROM tblAccounts", con))
            {
                cmd.CommandType = CommandType.Text;
                using (OleDbDataAdapter sda = new OleDbDataAdapter(cmd))
                {
                    using (DataTable dt = new DataTable())
                    {
                        sda.Fill(dt);
                        //Set AutoGenerateColumns False
                        dtGrdAccounts.AutoGenerateColumns = false;
                        //Set Columns Count
                        ***dtGrdAccounts.ColumnCount = 3;***
                        //Add Columns
                        dtGrdAccounts.Columns[0].Name = "AccountID";
                        dtGrdAccounts.Columns[0].HeaderText = "Id";
                        dtGrdAccounts.Columns[0].DataPropertyName = "AccID";

                        dtGrdAccounts.Columns[1].HeaderText = "Account name";
                        dtGrdAccounts.Columns[1].Name = "Account name";
                        dtGrdAccounts.Columns[1].DataPropertyName = "AccName";

                        dtGrdAccounts.Columns[2].Name = "AccountNumber";
                        dtGrdAccounts.Columns[2].HeaderText = "Account number";
                        dtGrdAccounts.Columns[2].DataPropertyName = "AccNumber";
                        dtGrdAccounts.DataSource = dt;
                    }
                }
            }
        }
    }

If I remove the line dtGrdAccounts.ColumnCount = 3; I am getting below error. Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index

After adding the a new record , On button save I am calling BindGrid() method to get the record in the GridiView.

string cmdText = "prAddAccounts";
OleDbCommand cmd = new OleDbCommand(cmdText, conn);            
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("AccName", txtAccName.Text.ToString());
 //..... other parameters  to insert record .....
OleDbCommand cmd = new OleDbCommand(cmdText, conn);            
cmd.CommandType = CommandType.StoredProcedure;
OleDbDataReader reader = cmd.ExecuteReader();
BindGrid();

解决方案

The issue is when you call the BindGrid() again you have to clear it first:

string cmdText = "prAddAccounts";
OleDbCommand cmd = new OleDbCommand(cmdText, conn);            
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("AccName", txtAccName.Text.ToString());
 //..... other parameters  to insert record .....

//Clear the binding.
dtGrdAccounts.DataSource = null;
//Bind the new data.
BindGrid();

这篇关于列计数属性不能在数据绑定的datagridview控件上设置c#的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆