我正在使用以下代码从数据表填充组合框:
public void PopulateCategoryCbo()
{
string connString = string.Format(<connectionString>);
NpgsqlConnection conn = new NpgsqlConnection(connString);
conn.Open();
string query = "SELECT id, category FROM categories ORDER BY category";
NpgsqlCommand cmd = new NpgsqlCommand(query, conn);
NpgsqlDataReader reader;
reader = cmd.ExecuteReader();
DataTable dt = new DataTable();
//DataRow row = dt.NewRow();
//row["id"] = 0;
//row["category"] = "All Categories";
//dt.Rows.InsertAt(row, 0);
dt.Columns.Add("id", typeof(string));
dt.Columns.Add("category", typeof(string));
dt.Load(reader);
cboSelectCategory.ValueMember = "id";
cboSelectCategory.DisplayMember = "category";
cboSelectCategory.DataSource = dt;
conn.Close();
}
[四行注释是我试图在数据表的顶部添加索引为0的“所有类别”行。我按照this SO question and answer编写了该代码。
但是,当我运行该解决方案时,它在row["id"] = 0;
行处中断,并显示消息,'列“ id”不属于表。'
我尝试使用0和1,认为它们将引用列的索引值,但是我得到了消息'列0不属于表。
我不明白为什么这不起作用。当我搜索此问题时,我看到了很多类似的解决方案。
您正在向dt添加一行,这是一个没有列的新DataTable。如果要填充数据表,请查看DbDataAdapter.Fill而不是DbDataReader。填写数据表,然后添加您的行。
不是原始问题的答案,但是使用下面的方法,您将消除主要问题。