繁体   English   中英

C#-“动态” DataGridView

[英]C# - “Dynamic” DataGridView

我正在尝试构建一个表单,用于将数据从CSV导入数据库。 现在,我正在努力完成以下任务:

根据表(数据应该导入到的位置),数据库中有许多列:DB_COL_AMOUNT = X

CSV文件可以具有不同数量的“列”。 它可能比数据库表具有更多或更少的列。 CSV_COL_AMOUNT = Y

现在,我想要一个DataGridView,它应该显示CSV文件的内容。 这部分很好,可以正常工作。

如果我的CSV文件中有三个“列”,我将在DataGrid中获得三列-并且还取决于,如果CSV文件中是否包含标题行,我将把Header的值用作DataGridView的列标题。

现在,我需要一些魔术:

我已经弄清楚了如何将ComboBox元素与DataGrid视图的ColumnHeder结合使用-以选择ColumnHeader名称。

我想要这样做,将DataGridView的列分配给数据库中的列。

FE:

数据库:

name | surename | birthdate | postalcode |

DataGridView的:

col1 | col2 | col3 | col4 |

此时,CSV文件的结构可能不同于数据库中的结构->我需要指定,应在表的哪一列中插入哪一列。

现在,我有了表的名称,可以进行分配:

col1 => surename, col2 => name, col3 => postalcode, col4 => birthdate

为此,我找到了以下代码:

List<string> ColumnHeaders = new List<string>();

using (SQLiteConnection dbConnection = new SQLiteConnection("Data Source=" + GetDBFile))
{
   try
   {
      dbConnection.Open();
   }
   catch (Exception ex)
   { }

   string SQL = "PRAGMA table_info (`contacts`)";

   using (SQLiteCommand command = new SQLiteCommand(SQL, dbConnection))
   {
      try
      {
         SQLiteDataReader reader = command.ExecuteReader();

         while (reader.Read())
         {
            if(reader.GetString(1) != "id")
            {
               ColumnHeaders.Add(reader.GetString(1));
            }
         }
      }
      catch (Exception ex)
      {
         MessageBox.Show(ex.Message);
      }
   }
}

ComboBox comboBoxHeaderCell = new ComboBox();
comboBoxHeaderCell.DropDownStyle = ComboBoxStyle.DropDownList;
comboBoxHeaderCell.Visible = true;

foreach (string Header in ColumnHeaders)
{
    comboBoxHeaderCell.Items.Add(Header);
    comboBoxHeaderCell.Text = Header;
 }

dataGridView1.Controls.Add(comboBoxHeaderCell);
comboBoxHeaderCell.Location = this.dataGridView1.GetCellDisplayRectangle(0, -1, true).Location;
comboBoxHeaderCell.Size = this.dataGridView1.Columns[0].HeaderCell.Size;

这绝对可以正常工作:如果我知道,我需要创建多少列。 但由于我不知道,在用户导入csv文件之前,DataGridView将具有多少列。

有谁知道我该如何运作?

我试图插入这部分

ComboBox comboBoxHeaderCell = new ComboBox();
comboBoxHeaderCell.DropDownStyle = ComboBoxStyle.DropDownList;
comboBoxHeaderCell.Visible = true;

foreach (string Header in ColumnHeaders)
{
    comboBoxHeaderCell.Items.Add(Header);
    comboBoxHeaderCell.Text = Header;
 }

 dataGridView1.Controls.Add(comboBoxHeaderCell);
 comboBoxHeaderCell.Location = this.dataGridView1.GetCellDisplayRectangle(0, -1, true).Location;
 comboBoxHeaderCell.Size = this.dataGridView1.Columns[0].HeaderCell.Size;

进入for循环并计算生成的DataGrid的columnNumber-但随后只会为第一列创建选择。

我认为,我需要更改ComboBox元素的名称,但是我不能通过使用反变量或类似方法来做到这一点。

抱歉-我直接在答案中找到了解决方案,在其中找到了用于获取列标题的ComboBox选择的解决方案。

修改此MSDN讨论中给出的代码后,它应该对我有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM