C# 如何根据ComboBox选择的更改事件将数据库中的数据提取到textbox中

C# 如何根据ComboBox选择的更改事件将数据库中的数据提取到textbox中,c#,winforms,combobox,C#,Winforms,Combobox,我想根据组合框的selectedIndexChanged事件从数据库加载数据。我有两个控件,cbDocName和tbDocFee这意味着当我从cbDocName中选择Doc时,Doc fee应该加载到tbDocFee中。以下是代码和随附的图片 上面的代码工作得很好,但是它没有在cbDocName中显示docName,而是将DocID显示为DisplayMember。以下是表单加载事件的代码 private void frmDocAppoinment_Load(object sender, Ev

我想根据
组合框
selectedIndexChanged事件
从数据库加载数据。我有两个
控件
cbDocName
tbDocFee
这意味着当我从
cbDocName
中选择Doc时,Doc fee应该加载到tbDocFee中。以下是代码和随附的图片

上面的代码工作得很好,但是它没有在cbDocName中显示docName,而是将DocID显示为
DisplayMember
。以下是
表单加载事件的代码

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
在所有这些操作中,我都会收到一个错误

对象引用未设置为对象的实例


请检查您的DocAppointSystem.Utillities.clsNewApp.LoadDocNameComboBox()所包含的对象列表 他回来了。我确信您用于DisplayMember的属性具有不同的名称。请检查“DocName”属性。可能是一个简单的拼写错误。

您需要使用:

cmd.Parameters.AddWithValue("@ID", cbDocsName.SelectedValue);
加载组合框时,您已将DocName设置为DisplayMember,将ID设置为ValueMember。因此,在选择时,SelectedText将成为名称,SelectedValue将成为ID。因此,在从数据库检索费用数据时,您需要参考该值,或者在本例中为SelectedValue

编辑

另外请注意,您必须在DataSource之前设置ValueMember和DisplayMember。因此,您需要:

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

可能有助于准确了解
LoadDocNameComboBox
返回的内容。显示
LoadDocNameComboBox
的功能。{LoadDocNameComboBox}从数据库返回DocName和DocID,并使用
cmd.Parameters.AddWithValue(@ID),cbDocsName.SelectedValue)填充ComboBox{LoadDocNameComboBox}返回DataTable我收到一个错误System.Data.dll中发生了System.ArgumentException类型的异常,但未在用户代码中处理其他信息:不存在从对象类型System.Data.DataRowView到未知托管提供程序本机类型的映射。`tbDocFees.Text=cmd.ExecuteScalar().ToString();`在这一行中,我将{Scalar}更改为{Reader},但没有帮助什么类型是docfeesdocfees数据类型是nVarcharTry tbDocFees.Text=(string)cmd.ExecuteScalar();没有任何拼写错误
cbDocsName.DisplayMember = "DocName"; 
cbDocsName.ValueMember = "ID"; 
cbDocsName.DataSource = LoadDocNameComboBox();