我有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());
}
答案 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();
}