【问题标题】:C# combo box value and display using invoke methodC# 组合框值并使用调用方法显示
【发布时间】:2011-12-14 13:40:43
【问题描述】:

我正在使用Windows Forms,并且我有一个包含值的组合框:

苹果
橙子

我的文本框包含值 1、2 和 3,

苹果 = 1,橙子 = 2,对 = 3。

这个关系在我的 SQL 表中,字段 Account 和 Name。如果组合框选择为橘子,如何将文本框的值更改为 = 2?

基本上这是对我正在开发的一个程序的引用,该程序有一个显示帐户名称的帐户组合框(用户友好)。我需要将姓名 ID 帐号显示在文本框中。然后,我可以从这个文本框中将值传递到我的存储过程中,该过程将获取该帐户的所有信息。

更新

以上文字已过时。见下文!

需要补充的一点是,我的代码获取了帐户详细信息并填充了我的组合框。

有没有简单的方法来做到这一点?或者这是否需要在 C# 中加入类似于表上的 SQL 联接?

或者根本不使用文本框,基本上我的组合将有 2 个橙色字段,2 个但只向用户显示橙色,但我的其他方法使用第二个字段 2。

好的,所以这部分将acc字段添加到组合框中。

{
    SqlCommand accountFill = new SqlCommand("SELECT name, acc FROM dbo.Customer", conn1);
    SqlDataReader readacc = accountFill.ExecuteReader();

    while (readacc.Read())
    {
        AddItem(readacc.GetString(0).ToString(), readacc, "name", "acc");
    }
    conn1.Close();
}

添加项是我的任务使用的调用方法。

private void AddItem(string value, Object dataSource, string name, string acc)
{
    if (accCollection.InvokeRequired)
    {
        accCollection.Invoke(new Action<string,Object,string,string>(AddItem), new Object[] { value });
    }
    else
    {
        //accCollection.Items.Add(value);
        accCollection.DataSource = dataSource;
        accCollection.DisplayMember = name;
        accCollection.ValueMember = acc;
    }
}

ERROR 复杂数据绑定在数据源处接受 i.list 或 i.list 源作为数据源。

【问题讨论】:

  • 甚至是 Asp 页面 - webforms 或 MVC?
  • 这是一个非常宽泛的问题,人们很难为您提供您可能想要的确切答案。简单地说,您的应用程序应该有一个处理所有数据库交互的数据层。然后,该层为您的主应用程序提供数据类,使用定义的接口提供业务逻辑。数据类本身可以包含用户可读的用户名和用户 ID(来自您的数据表)。然后以某种方式将这些绑定到您的 UI 界面,应尽可能将其与业务逻辑分离。将数据库访问代码直接放入 UI 很诱人
  • 这里有一个类似的帖子,可能对stackoverflow.com/questions/2209290/…有帮助
  • @ChrisBD 是的,如果这是一种 MVC 方法,但因为它是一种旧的 Winforms 方法 将 MVC 应用于应用程序 老板不想要或不需要。 (如果这是 asp.net MVC 应用程序,那么当然)

标签: c# winforms combobox textbox task


【解决方案1】:

ComboBox 类有两个属性ValueMemberDisplayMember。您需要将 DisplayMember 属性设置为表或数据的名称,即。 e.橙色、苹果等...,并将 ValueMember 属性设置为它们的 ID:

combobox1.Datasource = readacc;
combobox.DisplayMember = 'name';
combobox.ValueMember = 'acc';

那么您只需要使用两个属性SelectedValue 来获取Id 或SelectedText 来获取值。例如,您可以通过使用ComboBox.SelectedIndexChanged Event 来获取所选项目的 id,如下所示:

private void ComboBox1_SelectedIndexChanged(object sender, 
    System.EventArgs e)
{
    textbox2.text = int.parse(combobox1.SelectedValue.ToString());
}

或者你可以得到如下的选择文本:

textbox2.text = combobox1.SelectedText;

【讨论】:

  • 这里是我从查询中添加帐户的地方,combobox.Items.Add(value);
  • 你是说我不需要文本框吗?那很好啊。基本上我的组合将有 2 个字段 orange,2 但只向用户显示橙色,但我的其他方法使用第二个字段 2。
  • @StevenSmith 您只需要设置combobox.DisplayMember = valuecombobox.ValueMember = Id 然后只需使用SelectedValue 获取Id 或SelectedText 获取值这两个属性,如果不清楚我可以给你一个完整的例子,说明如何将数据库中的数据填充到组合框中,是的,你根本不需要文本框,你可以在没有文本框的情况下获取或设置 id 和 value。
  • 我从我的课堂上添加了一些代码,这样你就可以看到发生了什么。你会用选定的值替换 additem(tostring) 吗?对不起,你能用我提供的一小段代码给我一个例子吗?
  • 我问的原因是我的代码使用了 thread.tasks,正如你所看到的,我使用调用方法传递了 additem 字符串来填充我的组合框
【解决方案2】:
    DataTable dt = new DataTable("ListItem");
    dt.Columns.Add("Id", Type.GetType("System.Int32"));
    dt.Columns.Add("Name", Type.GetType("System.String"));

    dt.Rows.Add(new object[]{1,"apple"});
    dt.Rows.Add(new object[]{2,"oranges"});
    dt.Rows.Add(new object[]{3,"pairs"});

    comboBox1.DataSource = dt;
    comboBox1.DisplayMember = "Name";
    comboBox1.ValueMember="Id";

    textBox1.DataBindings.Add("Text", dt, "Id");

    comboBox1.SelectedIndexChanged += new EventHandler(comboBox1_SelectedIndexChanged);
    comboBox1.SelectedIndex = -1; //for initial step;

void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    textBox2.Text = comboBox1.SelectedValue.ToString();
}

【讨论】:

  • ahhhh 我看到了,我没有将结果输入到组合中,而是将其输入到数据表中,然后将其输入到我的组合中选择值和显示?
  • 当您更改选择时,文本框中的值会自动更改
  • 我唯一的问题是我因为任务而使用调用方法。我已经发布了一些代码,试图让事情正常进行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-13
  • 1970-01-01
  • 2020-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多