6

我正在将组合框与数据源、显示成员、值成员绑定。它在我的电脑上工作正常,但在客户端电脑上却不行。以下是我的源代码:

cbxAlloyBinding 方法是从 UserControl 的构造函数中调用的。

private void cbxAlloyBinding()
    {
        DataTable dt = new DataTable();
        SqlDataAdapter adp = new SqlDataAdapter("SELECT alloyName,alloyId FROM alloy", con);
        adp.Fill(dt);

        if (dt.Rows.Count > 0)
        {
            cbxMetal.DisplayMember = "alloyName";
            cbxMetal.ValueMember = "alloyId";
            cbxMetal.DataSource = dt;
        }
        else
        {
            cbxMetal.Text = "";
        }
    }

    private void cbxMetal_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (cbxMetal.SelectedIndex != -1)
        {
            DataTable dt = new DataTable();
            tempcmd = new SqlCommand("SELECT specification,alloyCode FROM alloy where alloyId='" + cbxMetal.SelectedValue + "'", con);
            SqlDataAdapter adp = new SqlDataAdapter(tempcmd);
            adp.Fill(dt);
            if (dt.Rows.Count > 0)
            {
                txtSpecification.Text = dt.Rows[0]["alloyCode"].ToString();
                txtSupplyConditions.Text = dt.Rows[0]["specification"].ToString();
                cbxheatBinding();
            }
            else
            {
                txtSpecification.Text = "";
            }

        }
    }

这从过去两天一直困扰着我,我几乎尝试了所有技巧,但仍然无法正常工作。

客户的 PC 使用的是 Windows 7 Ultimate、sql server 2005 和 .net framework 3.5。

4

8 回答 8

6

如果在您的构造函数cbxMetal_SelectedIndexChanged中调用之前cbxAlloyBinding()调用过您的调用,则肯定会发生这种情况。

例如(参见下面的代码),您可能在构造函数中有其他组合框绑定,这些绑定可能cbxAlloyBinding()在构造函数之前出现,并且这些绑定正在调用cbxMetal_SelectedIndexChanged.

public Constructor()
{
        InitializeComponent();

        cbxheatBinding();      //1st Three Binding Methods may be somehow related to your cbxMetal,
        dtpStartDateBinding(); //which leads them to call cbxMetal_SelectedIndexChanged method.
        dtpEndDateBinding();
        cbxAlloyBinding();
}

我怀疑您cbxMetal.DataSource是从代码中的其他点设置的,并且早于DisplayMember分配ValueMember

请记住,System.DataRow.DataRowView只有在

ComboBox.SelectedValueValueMember在分配之前调用。

于 2013-03-13T07:25:31.830 回答
5

设置DisplayMemberValueMemeber设置后DataSource为我解决了这个问题。

cbxMetal.DataSource = dt;
cbxMetal.DisplayMember = "alloyName";
cbxMetal.ValueMember = "alloyId";
于 2016-02-11T22:51:29.463 回答
0

我解决了同样的问题:

/*First get DataSource*/
comboBox1.DataSource = dt;
/*Then determine DisplayMember y ValueMember*/ 
comboBox1.DisplayMember = "YOUR_FIELD_NAME";
comboBox1.ValueMember = "YOUR_OTHER_FIELD_NAME";

这仅适用于 System.Data.DataTable 或 List 数据源

于 2014-04-14T17:59:00.100 回答
0

似乎问题不在于您在此处粘贴的代码,它可能与客户端环境、连接、权限等有关。您必须提供有关“它在客户端 pc 中不起作用”的更多信息。他们使用什么系统,错误是什么,您是否尝试过在客户端调试?

*编辑: *那么你必须从头开始跟踪所有操作的问题。我的建议是制作一个虚拟窗体应用程序,只是一个标准窗体、一个组合框和一个按钮。在按钮的单击事件上,只需执行您所做的操作。只需绑定组合并将此临时应用程序发送到客户端。如果可行,请逐步进行。例如:

private void button1_Click(object sender, EventArgs e)
    {
        string conStr = "Data Source=PC-303\\SQLEXPRESS;Initial Catalog=sokaklar;User ID=sa;Password=*****";

        SqlDataAdapter adapter = new SqlDataAdapter("SELECT DISTINCT IL, IL_ID FROM sokaklar ORDER BY IL", new SqlConnection(conStr));
        DataTable dt = new System.Data.DataTable();
        adapter.Fill(dt);            

        comboBox1.DisplayMember = "IL";
        comboBox1.ValueMember = "IL_ID";
        comboBox1.DataSource = dt;            
    }

我在一分钟内创建了这个应用程序,它对我有用。

于 2013-01-31T07:35:06.743 回答
0

这肯定会对您有所帮助

在加载事件上你想写这段代码

onformload()
{
    cmb_dept.Items.Clear();
    SqlConnection conn = new SqlConnection(@"DATA SOURCE=(localdb)\MSSQLLocalDB;INTEGRATED SECURITY=true;INITIAL CATALOG=EMPLOYEE;");
    conn.Open();
    SqlCommand command = new SqlCommand("select dept_id, dept_name from department", conn);
    SqlDataAdapter adapter = new SqlDataAdapter(command);
    DataSet ds = new DataSet();
    adapter.Fill(ds);
    cmb_dept.ValueMember = "dept_id";
    cmb_dept.DisplayMember = "dept_name";
    cmb_dept.DataSource = ds.Tables[0];
}

尝试使用使用要访问值的代码......

string dept = cmb_dept.Text;
MessageBox.Show("val=" + dept);

你的 combobox.text = System.Data.DataRowView 将被解决##

于 2018-03-03T17:28:22.533 回答
0

它向我展示了同样的异常,所以我这样做了,它奏效了

    private void cb_category_SelectedIndexChanged(object sender, EventArgs e)
    {


            DataTable mydt = new DataTable();
            try
            {
                mydt = request.GetItem(int.Parse(cb_category.SelectedValue.ToString()));
            }
            catch { }

            if(mydt.Rows.Count>0)
            {
            cb_Item.DataSource = mydt;
            cb_Item.DisplayMember = "dispmember";
            cb_Item.ValueMember = "valmember";
            }
            else
            {
                cb_Item.DataSource = null;
            }       

    }
于 2017-01-25T06:53:35.810 回答
0

阅读这篇文章中的答案告诉我,这个错误可以通过多种方式显示出来,对我来说,它是以下内容:我的组合框与问题中提到的完全一样,它工作正常,我更改了Sorted 的属性在设计器中将组合框设置为 True并开始在每个项目中获取数据行视图。在浪费了很多时间之后,发现 Sorted 属性应该是 False 才能按预期工作。排序必须不通过您用于获取数据的查询。

于 2021-11-30T05:52:43.477 回答
-1

“comboBox1.SelectedValue”返回对象,你想要作为字符串转换它 Convert.ToString(comboBox1.SelectedValue) 然后使用

例如:

  tempcmd = new SqlCommand("SELECT specification,alloyCode FROM alloy where alloyId='" + Convert.ToString(cbxMetal.SelectedValue) + "'", con);
于 2013-01-31T11:08:47.163 回答