C#中绑定数据的DataGridView控件无法设置列数属性。

4

我在表单中使用了一个DataGridView来控制输入和输出数据。在展示数据时,我会在两个场景下调用BindGrid方法:一个是在表单加载时,另一个是在添加新记录之后。

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

如果我删除dtGrdAccounts.ColumnCount = 3;这一行,就会出现以下错误。 Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index 在添加新记录后,点击保存按钮时,我调用BindGrid()方法将记录显示在GridView中。
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();

你尝试过在DataGridView中创建模板单元格吗?例如:dataGridView1.Columns.Add(new DataGridViewColumn(new DataGridViewTextBoxCell())); - Nilesh
或者可以像这样添加列:dataGridView1.Columns.Add(new DataGridViewTextBoxColumn()); - Nilesh
2个回答

3
问题在于当你再次调用BindGrid()时,你必须首先清除它:
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控件上设置ColumnCount属性”。但是在窗体加载时,它能正确显示GridView。 - Sanjeev4evr
@Sanjeev4evr 经过仔细检查你的代码后,我认为它很好,并且应该可以在没有我的建议的情况下正常工作,除了你可能需要在最后调用 dtGrdAccounts.DataBind()。请参考我的更新。问题是当你再次调用 BindGrid() 时,你必须先清除它。 - Racil Hilan
很遗憾,我无法获取DataBind()属性。这个属性会在Windows窗体DataGridView中出现吗?我是新手,如果问题有点儿傻,请不要介意。 - Sanjeev4evr
1
@Sanjeev4evr 啊,不好意思,那只适用于ASP.Net。对不起,我的错。请忽略那一行。 - Racil Hilan
Asp GridView 中类似于 WinForms DataGridView 的 OnselectedIndexChanged 事件是什么?当我选择一个 gridView 行时,我需要获取所选行的 ID,并根据所选值从数据库中获取该行的详细信息。 - Sanjeev4evr
@Sanjeev4evr 请尝试使用“SelectionChanged”。 - Racil Hilan

0
如果您多次调用datagridview列设计代码,则在设置列属性之前必须将Gridview数据源设置为null,如下所示:

dataGridView1.DataSource = null;

using (DataTable dt = new DataTable())
                {
                    //add this line of code
                    dtGrdAccounts.DataSource = null;

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

vb.net Datagridview1.datasource = NothingVB.NET Datagridview1.DataSource = Nothing - lava

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接