我正在尝试使用此代码根据另一个组合框选择从数据库向组合框显示一些数据:
private void metroComboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
DataSet dt = new DataSet();
try
{
DateTime startDate = Convert.ToDateTime(metroLabel8.Text);
DateTime endDate = Convert.ToDateTime(metroLabel9.Text);
// Make sql readable
string sql =
@"Select [LedId],[LedName] from [Ledger] where Date >= @prmStartDate and Date <= @prmEndDate";
// wrap IDisposable (SqlCommand) into using
using (SqlCommand cmd = new SqlCommand(sql, con))
{
cmd.Parameters.Add("@prmStartDate", SqlDbType.DateTime).Value = startDate;
cmd.Parameters.Add("@prmEndDate", SqlDbType.DateTime).Value = endDate;
con.Close();
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(dt);
VoucherLedgerName_combo.DisplayMember = "LedName";
VoucherLedgerName_combo.ValueMember = "LedId";
VoucherLedgerName_combo.DataSource = dt.Tables["Ledger"];
}
}
catch(Exception exe)
{
MessageBox.Show(exe.Message);
}
finally
{
if (con.State == ConnectionState.Open)
{
con.Close();
}
}
}
但我在第二个组合框中没有得到任何结果,我确信数据库表Ledger中有数据。任何人都可以帮我找到问题吗?
答案 0 :(得分:3)
更改您的SQL语句如下(日期是保留关键字)
string sql =
@"Select [LedId],[LedName] from [Ledger] where [Date] >= @prmStartDate and [Date] <= @prmEndDate";
填充数据集时需要提供表名,因为在设置数据源时使用名称
da.Fill(dt, "Ledger");
或将数据源设置如下
VoucherLedgerName_combo.DataSource = dt.Tables[0];
答案 1 :(得分:0)
DataRow dr = dt.NewRow();
dr["Ledger"] = "--Select All--";
dt.Rows.InsertAt(dr, 0);
答案 2 :(得分:0)
您可以从
更改da.Fill(dt);
VoucherLedgerName_combo.DataSource = dt.Tables["Ledger"];
到
da.Fill(dt, "Ledger");
VoucherLedgerName_combo.DataSource = dt.Tables["Ledger"].DefaultView;
否则
VoucherLedgerName_combo.DataSource = dt.Tables[0].DefaultView;
或
VoucherLedgerName_combo.DataSource = dt;