【问题标题】:Getting blank rows after setting DataGridView.DataSource设置 DataGridView.DataSource 后获取空白行
【发布时间】:2010-12-17 11:35:26
【问题描述】:

有人能告诉我为什么我在运行这段代码后会出现空白行吗?

...
dataGridView.AutoGenerateColumns = false; //must be false, else getting additional columns from SQL
dataGridView.DataSource = dataSet.Tables[0].DefaultView; 

也试过了

dataGridView.Update();

但不工作。

行数没问题,但为什么我得到空白行?

我正在使用 Winforms。

【问题讨论】:

    标签: c# winforms datagridview datasource


    【解决方案1】:

    在我的情况下,没有行可见,因为我通过 LINQ 生成数据并忘记在最后添加对 .ToArray() 的调用。将数据行转换为数组后,就可以了。

    【讨论】:

      【解决方案2】:

      如果有人仍然遇到问题,我的问题是我试图绑定到类公共字段而不是属性。更改为属性,即{得到; set;} 修复它。

      【讨论】:

        【解决方案3】:

        我知道已经很晚了,但我的案例解决方案不是自定义 datagridview 的列。只需添加一个空白的 datagridview 并绑定它。

        【讨论】:

          【解决方案4】:

          所以我有一个自定义实现,让用户能够保存列的类似 excel 的过滤器。

          我将结果加载到网格中,但由于列上类似 excel 的过滤器无法匹配任何内容,因此什么也没有出现。

          【讨论】:

            【解决方案5】:

            尝试在加载网格之前添加此代码

            dataGridView.ColumnCount = 0;
            

            【讨论】:

              【解决方案6】:

              我发现了问题。

              我在 VS datagridview 设计器中设计了列。不是列名,而是列 DataPropertyName 必须与数据库中的字段匹配。

              然后重复的列也会隐藏。

              【讨论】:

                【解决方案7】:

                Me.dgvList.AutoGenerateColumns = False

                    Dim col = New DataGridViewTextBoxColumn()
                    col.DataPropertyName = "VisitNo"
                    col.HeaderText = "Sr. No."
                    dgvList.Columns.Add(col)
                

                有效

                【讨论】:

                  【解决方案8】:

                  我知道您发布此内容已经很长时间了,但我遇到了同样的问题并想出了答案,所以我想我会发布它以便其他人受益。

                  您的列为空的原因是您还需要在设计器中设置每个列的 DataPropertyName 以匹配您的数据库字段名称。仅设置设计名称是不够的。

                  希望对某人有所帮助。

                  【讨论】:

                    【解决方案9】:

                    您的数据集中包含什么?

                    可能您的 DataSet 中包含的 DataTable 没有任何行。我会将 AutoGenerateColumns 保留为 true,然后手动隐藏您不想看到的列。我从未使用过 AutoGenerateColumns = false。但是,如果没有更多代码,将很难诊断。尝试交换这两个语句(首先是 .DataSource)。

                    AutoGenerateColumns 可能对相应的绑定源(DataSet 中的DataTable)没有影响。

                    DataSet需要由DataAdapter填充:

                    // Example
                    DataAdapter = new SqlDataAdapter();
                    DataAdapter = CreateInventoryAdapter();
                    DataAdapter.TableMappings.Add("Table", "GARAGE");
                    
                    DataAdapter.Fill(myDataSet);
                    myDataView = myDataSet.Tables[0].DefaultView;
                    dataGridView1.DataSource = myDataView
                    

                    【讨论】:

                    • 各位感谢您的帮助,但我不想再花时间在这上面了。我的扩展代码也可以正常工作,所以不想再更改它。最好的问候
                    【解决方案10】:

                    尝试以下方法:

                    grid.AutoGenerateColumns = false;
                    
                    DataGridViewColumn col = new DataGridViewTextBoxColumn();
                    col.DataPropertyName = "Prop1";
                    col.HeaderText = "Property 1";
                    grid.Columns.Add(col);
                    
                    col = new DataGridViewTextBoxColumn();
                    col.DataPropertyName = "Prop2";
                    col.HeaderText = "Property 2";
                    grid.Columns.Add(col);
                    
                    grid.DataSource = dataSet.Tables[0].DefaultView;
                    

                    Prop1 和 Prop2 应该与表的列名匹配。属性 1 & 属性 2 是要显示的标题文本。

                    编辑:

                    从您给出的示例看来,您正在将绑定列与未绑定列组合在一起。

                    这样做:

                    1.删除使用设计器添加的任何列 2.添加此代码:

                    grid.AutoGenerateColumns = false;
                    
                    DataGridViewColumn colID = new DataGridViewTextBoxColumn();
                    colID.DataPropertyName = "customerID";
                    colID.HeaderText = "Ident.";
                    grid.Columns.Add(colID);
                    
                    DataGridViewColumn colName = new DataGridViewTextBoxColumn();
                    colName.DataPropertyName = "customerFirstName";
                    colName.HeaderText = "First name";
                    grid.Columns.Add(colName);    
                    grid.DataSource = dataSet.Tables[0].DefaultView;
                    

                    HTH。

                    【讨论】:

                    • 我的代码和你的一样。只是我在设计器中设置了 datagridview 列,并且它们与我的表列名匹配。
                    • 然后,如果您使用设计器绑定网格并且从 sql 获取其他列是您唯一关心的问题,您可以简单地使用设计器使不需要的列不可见。
                    • 我可以使它们不可见,但附加的列标题文本与使用设计器制作的其他列不同。 p.s.:这是一个多语言应用程序。
                    • 我不确定我是否正确...据我了解,您有一组列,其中一些是不可见的,而另一些是可见的。对于不可见的列,标题文本并不重要。对于可见列,您可以根据当前语言以编程方式设置显示的标题文本。没有看到问题出在哪里,但我可能会遗漏一些东西。也许更扩展的代码示例会有所帮助。
                    • Sorin 上面你可以看到我的问题的扩展描述。
                    【解决方案11】:

                    好的,更扩展的示例:

                    我在设计师中做了一些专栏:

                    列名:customerID and customerFirstName

                    列标题文本:Ident. and First name

                    然后我从 sql 表中获取一些数据...

                    sql = "select customerID, customerFirstName From customer;";
                    
                    dataGridView.AutoGenerateColumns = false;
                    dataGridView.DataSource = dataSet.Tables[0].DefaultView;
                    

                    和sql表的列和dataGridView中的列名一样。

                    dataGridView.AutoGenerateColumns = false; 是一个带有headerText Ident. | First name 的两列dataGridView 时我得到的结果。

                    当我设置 dataGridView.AutoGenerateColumns = true; 时,我得到如下 dataGridView 列: Ident. | First name | customerID | customerFirstName.

                    IdentFirst name 以下的所有行都是 emptycustomerIDcustomerFirstName 以下的所有其他行都是 ok

                    现在我希望 customerIDcustomerFirstName 下面的行将在 IdentFirst name 下,并且 customerIDcustomerFirstName 列应该被隐藏。

                    我写了这段代码,它可以工作:

                     DataTable dTable = dataGridView.GetTable().Tables[0];
                    
                     foreach (DataRow dataRow in dataGridView.GetTable().Tables[0].Rows)
                     {
                        int n = dataGridView.Rows.Add();
                        foreach (DataColumn dataColumn in dTable.Columns)
                        {
                           dataGridView.Rows[n].Cells[dataColumn.ColumnName].Value = dataRow[dataColumn.ColumnName].ToString();
                        }
                     }
                    

                    但为什么 DataGridView 不使用此代码为我执行此操作:

                    dataGridView.DataSource = dataSet.Tables[0].DefaultView;

                    【讨论】:

                    • 你填满你的数据集了吗?数据适配器 = 新的 SqlDataAdapter(); DataAdapter = CreateInventoryAdapter(); DataAdapter.TableMappings.Add("Table", "GARAGE"); DataAdapter.Fill(myDataSet); myDataView = myDataSet.Tables[0].DefaultView; dataGridView1.DataSource = myDataView
                    【解决方案12】:

                    另外,如果您使用 AutoGenerateColumns=false,请确保您添加了一些绑定列,否则您将获得每条记录的空白行

                    【讨论】:

                    • 你有一个关于如何添加绑定列的简短示例吗?
                    猜你喜欢
                    • 2017-02-12
                    • 1970-01-01
                    • 2016-07-20
                    • 2021-04-29
                    • 2019-01-18
                    • 2016-06-03
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多