2017-08-26 78 views
1

我想从的ComboBox的基础上加载数据库中的数据。我有2 controls,cbDocNametbDocFee意思是当我从cbDocName中选择Doc时,Doc费用应该加载到tbDocFee中。以下是代码和图像附着如何基于ComboBox选择的更改事件从数据库中将数据提取到文本框中

enter image description here

private void cbDocsName_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     GetDocFees(); 
    } 
    public void GetDocFees() 
    { 
     string CS = ConfigurationManager.ConnectionStrings["MyCon"].ConnectionString; 
     using (SqlConnection con = new SqlConnection(CS)) 
     { 
      SqlCommand cmd = new SqlCommand("SELECT DocFees FROM AddDoctor WHERE [email protected]", con); 
      cmd.CommandType = CommandType.Text; 
      cmd.Parameters.AddWithValue("@ID", cbDocsName.Text); 
      con.Open(); 
      tbDocFees.Text = cmd.ExecuteScalar().ToString(); 

     } 
    } 

上面的代码完美地工作,而是表示cbDocName DOCNAME的,它显示的DocID作为DisplayMember。这里是更新form load event

private void frmDocAppoinment_Load(object sender, EventArgs e) 
    { 
     cbDocsName.DataSource = DocAppoinmentSystem.Utillities.clsNewApp.LoadDocNameComboBox(); 
     cbDocsName.DisplayMember = "DocName"; 
     cbDocsName.ValueMember = "ID"; 
    } 

代码:LoadDocNameComboBox()代码如下

public static DataTable LoadDocNameComboBox() 
    { 
     DataTable dtCampus = new DataTable(); 
     string CS = ConfigurationManager.ConnectionStrings["MyCon"].ConnectionString; 
     using (SqlConnection con = new SqlConnection(CS)) 
     { 
      using (SqlCommand cmd = new SqlCommand("SELECT ID,DocName FROM AddDoctor WHERE DocStatus='PRESENT'", con)) 
      { 
       cmd.CommandType = CommandType.Text; 
       con.Open(); 
       SqlDataReader r = cmd.ExecuteReader(); 
       dtCampus.Load(r); 
      } 
     } 
     return dtCampus; 
    } 

注:cbDocName.SelectedIndex, cbDocName.SelectedText, cbDocName.SelectedItem在所有的这些,我得到一个错误

对象未设置到一个对象的实例

+1

可能有助于了解什么'LoadDocNameComboBox'返回,确切地说。 – DonBoitnott

+0

显示“LoadDocNameComboBox”的功能。 – Codexer

+0

{LoadDocNameComboBox}从数据库返回DocName和DocID并填充组合框 –

回答

1

您需要使用:

cmd.Parameters.AddWithValue("@ID", cbDocsName.SelectedValue); 

当加载您的组合框已设置为可采用DocName和DisplayMember ID作为ValueMember。因此,在选择上,SelectedText成为名称,而SelectedValue成为ID。因此,在从数据库中检索费用数据时,您需要参考该值,或者在这种情况下参考SelectedValue。

编辑

同时请注意,你有数据源之前设置ValueMember和DisplayMember。所以你需要:

cbDocsName.DisplayMember = "DocName"; 
cbDocsName.ValueMember = "ID"; 
cbDocsName.DataSource = LoadDocNameComboBox(); 
+0

通过使用cmd.Parameters.AddWithValue(“@ ID”,cbDocsName.SelectedValue);'我得到了错误 System.Data.dll中发生类型System.ArgumentException的异常,但未在用户代码中处理 附加信息:无映射从对象类型System.Data.DataRowView到未知的托管提供程序本机类型存在。 –

+0

你会得到这个错误? –

+0

'tbDocFees.Text = cmd.ExecuteScalar()。ToString();'在这一行上,我将{标量}更改为{Reader}但没有帮助 –

0

请求请检查您的DocAppoinmentSystem.Utillities.clsNewApp.LoadDocNameComboBox() 正在返回的对象列表。我确信您用于DisplayMember的属性具有不同的名称。请检查“DocName”属性。可能是一个简单的拼写错误。

+0

没有任何拼写错误 –

相关问题