C#如何将数据库值获取到Datagridview组合框

时间:2018-08-23 11:15:36

标签: c# winforms sql-server-2008 datagridview

我有Datagridview,所有这些数据都来自我的数据库(SQL)。我有一列“数量”,并在我的数据网格中创建了一个“数量”组合框。在运行时,组合框已经存在,但是我无法将“数量”(文本框)的值添加到我的“数量”(组合框)中。这是我的代码

private DataTable _products()
    {
        using (var con = SQLConnection.GetConnection())
        {
            var ds = new DataSet();
            var select = new SqlCommand("Select * from employee_product", con);
            var sda = new SqlDataAdapter();
            sda.SelectCommand = select;       
            sda.Fill(ds);
            dt = ds.Tables[0];


            return dt;             
        }
    }
    private void fillcombo()
    {
        var combo = new DataGridViewComboBoxColumn();
        ListProduct.Columns.Add(combo);
        combo.HeaderText = "Quantity";
        combo.Name = "combo";
        ArrayList row = new ArrayList();

        foreach (DataRow dr in dt.Rows)
        {
            row.Add(dr["Quantity"].ToString());
        }
        combo.Items.AddRange(row.ToArray());


    }

2 个答案:

答案 0 :(得分:1)

下面是我的评论所描述的一个小例子。

使用DataGridViewComboBoxColumn时可能会遇到的一些指针…首先,我建议您连接网格DataError.,如果值不在组合框中,则该网格将引发DataError异常。此外,在大多数情况下,发生这种情况将使您的程序无法正常运行,因为每当网格获得焦点或添加更多数据时,网格将继续引发此错误。这就是为什么要连接网格DataError…的原因…我几乎可以保证,如果不小心确保组合框具有原始数据中的所有值,则会收到此错误。

方便和幸运的是,已发布的代码正在填充组合框将“仅” DataTable.中实际存在的数据。这确保了在将数据加载到组合框中时组合框将是好的。网格。不幸的是,如代码所示,在“数量”值的情况下……仅DataTable中的值将出现在组合框中。并非总是如此或您想要什么……

在下面的小示例中,数据中只有五(5)个不同的“数量”值,运行代码时,每个组合框仅包含五(5)个不同的值。如果用户想要将该值更改为“ 7.5”,则可能会出现问题。该值不在原始数据中,并且不会在组合框中供用户选择;因此,这种方法可能会错过一些需要的值。

以“数量”为例,我想您可能希望“数量”为从1到10的值(以0.5增量)。这将是值1、1.5、2、2.5、3、3.5…等。以10的限制为例说明,通常该组合将包含“可能”不在原始数据中的值。将组合框数据表设置为这些(默认)值将显示上述值。但是,在下面的示例中查看原始数据,这将在加载数据时崩溃,因为原始数据中的值不在组合框数据表中,即12.5、33.5和22.5,因为这些值大于10。

这是一个“重要”要点。每当您在网格上使用数据源时,它都有一个预先填充有数据的组合框……您最好确保原始数据的组合框中的值不存在。如果没有此项检查,DataError很可能会弹出一行。因此,这是您始终要查找/检查的内容。

幸运的是,已发布的代码已经在执行此操作。在下面的GetComboColumn方法中,注释掉的行GetFullComboDT将在组合框中获取我们想要的所有值。现在,我们必须确保原始数据没有任何不在组合框中的值。在下面的示例中,完整组合框中没有三(3)个值……12.5、33.5和22.5。循环将继续并将这些值“添加”到组合框。这几乎可以确保您避免遇到可怕的DataError.

我希望这会有所帮助。

public Form1() {
  InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e) {
  DataTable gridDT = GetGridTable();
  FillGridTable(gridDT);
  DataGridViewComboBoxColumn combocol = GetComboColumn(gridDT);
  dataGridView1.Columns.Add(combocol);
  dataGridView1.DataSource = gridDT;
}

private DataTable GetGridTable() {
  DataTable dt = new DataTable();
  dt.Columns.Add("Col1", typeof(string));
  dt.Columns.Add("Col2", typeof(string));
  dt.Columns.Add("Quantity", typeof(decimal));
  return dt;
}

private DataTable GetComboTable() {
  DataTable dt = new DataTable();
  dt.Columns.Add("index", typeof(int));
  dt.Columns.Add("Quantity", typeof(decimal));
  return dt;
}

private void FillGridTable(DataTable dt) {
  dt.Rows.Add("C0R0", "C1R0", 12.5);
  dt.Rows.Add("C0R1", "C1R1", 2);
  dt.Rows.Add("C0R2", "C1R2", 33.5);
  dt.Rows.Add("C0R3", "C1R3", 1);
  dt.Rows.Add("C0R4", "C1R4", 22.5);
  dt.Rows.Add("C0R5", "C1R5", 1);
  dt.Rows.Add("C0R6", "C1R6", 12.5);
}

private DataGridViewComboBoxColumn GetComboColumn(DataTable dt) {
  DataGridViewComboBoxColumn combo = new DataGridViewComboBoxColumn();
  combo.HeaderText = "Quantity";
  combo.Name = "combo";
  combo.DataPropertyName = "Quantity";
  combo.DisplayMember = "Quantity";
  DataTable comboDT = GetComboTable();
  //DataTable comboDT = GetFullcomboDT();
  int index = 0;
  foreach (DataRow dr in dt.Rows) {
    if (NewValue((decimal)dr["Quantity"], comboDT)) {
      comboDT.Rows.Add(index, dr["Quantity"]);
    }
  }
  combo.DataSource = comboDT;
  return combo;
}

private bool NewValue(decimal value, DataTable dt) {
  foreach (DataRow row in dt.Rows) {
    if (((decimal)row["Quantity"]) == value) {
      return false;
    }
  }
  return true;
}

private DataTable GetFullcomboDT() {
  DataTable dt = new DataTable();
  dt.Columns.Add("index", typeof(int));
  dt.Columns.Add("Quantity", typeof(decimal));
  decimal currentValue = 1.0m;
  int index = 0;
  for (int i = 0; i < 20; i++) {
    dt.Rows.Add(index, currentValue);
    currentValue += 0.5m;
    index++;
  }
  return dt;
}

答案 1 :(得分:0)

您必须手动将值添加到组合框并首先声明它们的类型。 这样的事情应该可以做到:

    DataGridViewComboBoxCell dgvcell;
    for (int x = 0; (x <= (DataGridView1.Rows.Count - 1)); x++) 
    {
    SQL_cmd.CommandText = "select something from somethingelse where something = @something ";
        sql_cmd.parameters.addwithvalue("@something", DataGridView1.Rows[x].Cells["something"].Value);
        SQL_reader = SQL_cmd.ExecuteReader;
        while (SQL_reader.Read) {
        dgvcell = ((DataGridViewComboBoxCell)(this.DataGridView1.Rows(x).Cells["something"]));
        dgvcell.Items.Add(SQL_reader("something"));
        }

        SQL_reader.Close();
    }