C# 使用 Npgsql 使用 postgreSQL select 填充组合框,然后填充其他文本框
C# fill combo box with postgreSQL select using Npgsql then populate other textboxes
我正在使用 Npgsql 程序集。
我有代码用 SQLquery 的结果填充 datagridview,我还希望它同时填充组合框,然后一旦 selection 被填充,其他两个文本框就会被填充与相同行值的其他两个字段。
controlp 包含 3 个字段:
com pri not
add 1 adds a file
del 2 deletes a file
ame 3 amends a file
仅供参考,连接字符串存储在另一个 class。
填充数据网格视图的当前代码:
string pquery = "SELECT * FROM controlp";
NpgsqlConnection conn = new NpgsqlConnection(Utils.ConnectionString);
conn.Open();
NpgsqlCommand pcmd = new NpgsqlCommand(pquery, conn);
NpgsqlDataAdapter pda = new NpgsqlDataAdapter();
pda.SelectCommand = pcmd;
DataTable pdt = new DataTable();
pda.Fill(pdt);
pDGV.DataSource = pdt;
conn.Close();
我创建了两个组合框来保存 selected 索引值,然后再将它们放入文本框,例如,如果我 select comComboBox
中的一个值,add
例如,我希望它用 'adds a file' 填充 notComboBox
,用 1
填充 priComboBox
,因为它们在同一行中。
我试过这段代码,但是当我在 comComboBox 中创建 selection 时出现错误:
string pquery = "SELECT * FROM controlp";
NpgsqlConnection conn = new NpgsqlConnection(Utils.ConnectionString);
conn.Open();
NpgsqlCommand pcmd = new NpgsqlCommand(pquery, conn);
NpgsqlDataAdapter pda = new NpgsqlDataAdapter();
pda.SelectCommand = pcmd;
DataTable pdt = new DataTable();
pda.Fill(pdt);
pDGV.DataSource = pdt;
for (int i = 0; i < pdt.Rows.Count; i++)
{
comComboBox.Items.Add(pdt.Rows[i].ItemArray[0].ToString());
}
conn.Close();
private void comComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
priComboBox.SelectedIndex = notComboBox.SelectedIndex = comComboBox.SelectedIndex;
notTextBox.Text = notComboBox.Text;
priTextBox.Text = priComboBox.Text;
}
错误:
System.ArgumentOutOfRangeException: InvalidArgument=Value of '0' is not valid for 'SelectedIndex'.
Parameter name: SelectedIndex
通过为其他两个组合框添加添加行来实现这一点。
string pquery = "SELECT * FROM controlp";
NpgsqlConnection conn = new NpgsqlConnection(Utils.ConnectionString);
conn.Open();
NpgsqlCommand pcmd = new NpgsqlCommand(pquery, conn);
NpgsqlDataAdapter pda = new NpgsqlDataAdapter();
pda.SelectCommand = pcmd;
DataTable pdt = new DataTable();
pda.Fill(pdt);
pDGV.DataSource = pdt;
for (int i = 0; i < pdt.Rows.Count; i++)
{
comComboBox.Items.Add(pdt.Rows[i].ItemArray[0].ToString());
priComboBox.Items.Add(pdt.Rows[i].ItemArray[1].ToString());
notComboBox.Items.Add(pdt.Rows[i].ItemArray[2].ToString());
}
conn.Close();
private void comComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
priComboBox.SelectedIndex = notComboBox.SelectedIndex = comComboBox.SelectedIndex;
notTextBox.Text = notComboBox.Text;
priTextBox.Text = priComboBox.Text;
}
您可以将从数据库中检索到的整行直接存储在单个 ComboBox 中。在这种情况下,您应该为您的组合框提供有关 属性 用于在其列表和文本中显示的信息。
最好的方法是定义一个 class 'models' 你的数据库 table,然后用循环结果时创建的实例填充这个 table 的列表。
public class ControlP
{
public string Com {get;set;}
public int Pri { get; set; }
public string Not {get;set;}
}
......
List<ControlP> results = new List<ControlP>();
string pquery = "SELECT * FROM controlp";
// Don't forget to enclose the connection in a using statement. It is a
// disposable object and should be correctly destroyed when you finish to use it
using(NpgsqlConnection conn = new NpgsqlConnection(Utils.ConnectionString))
using(NpgsqlCommand pcmd = new NpgsqlCommand(pquery, conn))
{
conn.Open();
using(NpgsqlDataReader reader = pcmd.ExecuteReader())
{
while(reader.Read())
{
ControlP p = new ControlP();
p.Com = reader["com"].ToString();
p.Pri = Convert.ToInt32(reader["pri"]);
p.Not = reader["not"].ToString();
results.Add(p);
}
pDGV.DataSource = results;
comComboBox.DataSource = results;
comComboBox.DisplayMember = "Com";
comComboBox.ValueMember = "Pri";
}
}
此时您可以使用 SelectedIndexChanged 事件检索所选对象并读取其属性,而无需其他两个组合。
private void comComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
if(comComboBox.SelectedItem != null)
{
ControlP p = comComboBox.SelectedItem as ControlP;
notTextBox.Text = p.Not;
priTextBox.Text = p.Pri;
}
}
请记住,当您设置 DataSource 时,您不能使用 Items 集合。您应该始终从基础组合的数据源 add/delete/remove 元素
我正在使用 Npgsql 程序集。
我有代码用 SQLquery 的结果填充 datagridview,我还希望它同时填充组合框,然后一旦 selection 被填充,其他两个文本框就会被填充与相同行值的其他两个字段。
controlp 包含 3 个字段:
com pri not
add 1 adds a file
del 2 deletes a file
ame 3 amends a file
仅供参考,连接字符串存储在另一个 class。
填充数据网格视图的当前代码:
string pquery = "SELECT * FROM controlp";
NpgsqlConnection conn = new NpgsqlConnection(Utils.ConnectionString);
conn.Open();
NpgsqlCommand pcmd = new NpgsqlCommand(pquery, conn);
NpgsqlDataAdapter pda = new NpgsqlDataAdapter();
pda.SelectCommand = pcmd;
DataTable pdt = new DataTable();
pda.Fill(pdt);
pDGV.DataSource = pdt;
conn.Close();
我创建了两个组合框来保存 selected 索引值,然后再将它们放入文本框,例如,如果我 select comComboBox
中的一个值,add
例如,我希望它用 'adds a file' 填充 notComboBox
,用 1
填充 priComboBox
,因为它们在同一行中。
我试过这段代码,但是当我在 comComboBox 中创建 selection 时出现错误:
string pquery = "SELECT * FROM controlp";
NpgsqlConnection conn = new NpgsqlConnection(Utils.ConnectionString);
conn.Open();
NpgsqlCommand pcmd = new NpgsqlCommand(pquery, conn);
NpgsqlDataAdapter pda = new NpgsqlDataAdapter();
pda.SelectCommand = pcmd;
DataTable pdt = new DataTable();
pda.Fill(pdt);
pDGV.DataSource = pdt;
for (int i = 0; i < pdt.Rows.Count; i++)
{
comComboBox.Items.Add(pdt.Rows[i].ItemArray[0].ToString());
}
conn.Close();
private void comComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
priComboBox.SelectedIndex = notComboBox.SelectedIndex = comComboBox.SelectedIndex;
notTextBox.Text = notComboBox.Text;
priTextBox.Text = priComboBox.Text;
}
错误:
System.ArgumentOutOfRangeException: InvalidArgument=Value of '0' is not valid for 'SelectedIndex'. Parameter name: SelectedIndex
通过为其他两个组合框添加添加行来实现这一点。
string pquery = "SELECT * FROM controlp";
NpgsqlConnection conn = new NpgsqlConnection(Utils.ConnectionString);
conn.Open();
NpgsqlCommand pcmd = new NpgsqlCommand(pquery, conn);
NpgsqlDataAdapter pda = new NpgsqlDataAdapter();
pda.SelectCommand = pcmd;
DataTable pdt = new DataTable();
pda.Fill(pdt);
pDGV.DataSource = pdt;
for (int i = 0; i < pdt.Rows.Count; i++)
{
comComboBox.Items.Add(pdt.Rows[i].ItemArray[0].ToString());
priComboBox.Items.Add(pdt.Rows[i].ItemArray[1].ToString());
notComboBox.Items.Add(pdt.Rows[i].ItemArray[2].ToString());
}
conn.Close();
private void comComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
priComboBox.SelectedIndex = notComboBox.SelectedIndex = comComboBox.SelectedIndex;
notTextBox.Text = notComboBox.Text;
priTextBox.Text = priComboBox.Text;
}
您可以将从数据库中检索到的整行直接存储在单个 ComboBox 中。在这种情况下,您应该为您的组合框提供有关 属性 用于在其列表和文本中显示的信息。
最好的方法是定义一个 class 'models' 你的数据库 table,然后用循环结果时创建的实例填充这个 table 的列表。
public class ControlP
{
public string Com {get;set;}
public int Pri { get; set; }
public string Not {get;set;}
}
......
List<ControlP> results = new List<ControlP>();
string pquery = "SELECT * FROM controlp";
// Don't forget to enclose the connection in a using statement. It is a
// disposable object and should be correctly destroyed when you finish to use it
using(NpgsqlConnection conn = new NpgsqlConnection(Utils.ConnectionString))
using(NpgsqlCommand pcmd = new NpgsqlCommand(pquery, conn))
{
conn.Open();
using(NpgsqlDataReader reader = pcmd.ExecuteReader())
{
while(reader.Read())
{
ControlP p = new ControlP();
p.Com = reader["com"].ToString();
p.Pri = Convert.ToInt32(reader["pri"]);
p.Not = reader["not"].ToString();
results.Add(p);
}
pDGV.DataSource = results;
comComboBox.DataSource = results;
comComboBox.DisplayMember = "Com";
comComboBox.ValueMember = "Pri";
}
}
此时您可以使用 SelectedIndexChanged 事件检索所选对象并读取其属性,而无需其他两个组合。
private void comComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
if(comComboBox.SelectedItem != null)
{
ControlP p = comComboBox.SelectedItem as ControlP;
notTextBox.Text = p.Not;
priTextBox.Text = p.Pri;
}
}
请记住,当您设置 DataSource 时,您不能使用 Items 集合。您应该始终从基础组合的数据源 add/delete/remove 元素