如何在c#winform应用程序中创建两个组合框之间的关系

时间:2015-03-06 11:17:26

标签: c#

我需要创建两个组合框,当我在组合框1中选择一个值时,相关值应显示在组合框2中。值取自两个不同的数据库表(deviceCat和Device)。请为我的C#winform应用程序提供帮助。我是c#编程的新手。感谢。

8 个答案:

答案 0 :(得分:1)

using System;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            comboBox1.Items.Add("weekdays");
            comboBox1.Items.Add("year");
        }
        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            comboBox2.Items.Clear();
            if (comboBox1.SelectedItem == "weekdays")
            {
                comboBox2.Items.Add("Sunday");
                comboBox2.Items.Add("Monday");
                comboBox2.Items.Add("Tuesday");
            }
            else if (comboBox1.SelectedItem == "year")
            {
                comboBox2.Items.Add("2012");
                comboBox2.Items.Add("2013");
                comboBox2.Items.Add("2014");
            }
        }
    }
}

答案 1 :(得分:0)

您可以使用OnSelectedValueChanged事件处理程序触发代码清除并重新填充第二个组合框中的数据

答案 2 :(得分:0)

    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        switch (comboBox1.Text)
        {
            case "Something":
                comboBox2.Items.Clear();
                comboBox2.Items.Add("Option1");
                comboBox2.Items.Add("Option2");
                comboBox2.Items.Add("Option3");
                break;
            case "Something else":
                comboBox2.Items.Clear();
                comboBox2.Items.Add("Option4");
                comboBox2.Items.Add("Option5");
                comboBox2.Items.Add("Option6");
                break;
            default:
                break;
        }

    }

如果你这样做,它应该有效。这样做是检查combobox1中的文本,然后相应地修改第二个文本

答案 3 :(得分:0)

只是一个快速的模型:

var cb1 = new ComboBox();
var cb2 = new ComboBox();

cb1.Items.AddRange(firstItems); // whatever you want to put into the first ComboBox
cb2.Items.AddRange(secondItems); // whatever you want to put into the second ComboBox

public void ChangeSelectionInSecondComboBox(object sender, EventArgs e)
{
    var selectedItem = cb1.SelectedItem;
    if(selectedItem == [...]) // depends on how you want to decide which item 
                                 to display in ComboBox2
    {
        cb2.SelectedIndex = [...] // you need to decide which Index to set
    }
}

cb1.SelectedIndexChanged += ChangeSelectionInSecondComboBox;

基本上,您想要的是收听第一个SelectionChanged的{​​{1}}事件,然后在第二个ComboBox中选择相关项。

答案 4 :(得分:0)

您只需要利用master组合框的selectIndexChanged事件来更新相关组合框中的selectedItem。

这是一个例子。我有两节课。客户端类和Contract类。每个客户都有合同

这是契约类:

 public class Contract
 {

     public String ContractNumber { get; set; }
     public Contract(String contractNumber)
     {
         ContractNumber = contractNumber;
     }

     public override string ToString()
     {

         return "Contract Number :" + ContractNumber;
     }
 }

这是Client类:

 public class Client
 {
     public String Name { get; set; }
     public Contract SignedContract { get; set; }

     public Client(String name, Contract contract)
     {
         Name = name;
         SignedContract = contract;
     }

     public override string ToString()
     {
         return "Client " + Name;
     }
 }

一些示例工作的示例数据(在windows窗体的formLoad事件中调用)

  Contract c1 = new Contract("NRCONTRACT0001");
  Contract c2 = new Contract("NRCONTRACT0005");
  Contract c3 = new Contract("NCAB_84_PK65");

  Client cl1 = new Client("BTHOS", c1);
  Client cl2 = new Client("FTIA Consulting", c2);
  Client cl3 = new Client("GAMMA INFO", c3);

  Client[] clients = new Client[] {cl1,cl2,cl3};
  Contract[] contracts = new Contract[] {c1, c2, c3};

  comboBox1.Items.AddRange(clients);
  comboBox2.Items.AddRange(contracts);

然后在第一个combox框中选择index changed事件,我拿起对象并将其转换为Client以利用客户端和合同之间的关系

  private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
  {
        comboBox2.SelectedItem = ((Client)comboBox1.SelectedItem).SignedContract;
  }

工作正常。

答案 5 :(得分:0)

这是我到目前为止所拥有的

private void cmbFaultCat1_SelectedIndexChanged(object sender, EventArgs e)
    {
        SqlCommand cmd2 = new SqlCommand("SELECT * FROM tblFault WHERE faultCat='" + cmbFaultCat1.SelectedItem + "'", con);
        SqlDataReader myReader2;

        // Combo Relationship
        try
        {
            con.Open();
            myReader2 = cmd2.ExecuteReader();
            while (myReader2.Read())
            {
                cmbDevice1.Items.Add(myReader2["fault"]);
            }
            con.Close();
            //con.Dispose();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

仍显示表格中的所有数据..

答案 6 :(得分:0)

    private DataSet m_ds = new DataSet();
    private CurrencyManager m_Currency;

    private void Form8_Load(object sender, EventArgs e)
    {
        DataTable T1 = m_ds.Tables.Add("T1");
        T1.Columns.Add("T"); 
        T1.Columns.Add("V");

        DataRow T1_ROW = T1.NewRow();
        T1_ROW["T"] = "1";
        T1_ROW["V"] = "1";
        T1.Rows.Add(T1_ROW);

        T1_ROW = T1.NewRow();
        T1_ROW["T"] = "2";
        T1_ROW["V"] = "2";
        T1.Rows.Add(T1_ROW);

        T1_ROW = T1.NewRow();
        T1_ROW["T"] = "3";
        T1_ROW["V"] = "3";
        T1.Rows.Add(T1_ROW);

        T1_ROW = T1.NewRow();
        T1_ROW["T"] = "4";
        T1_ROW["V"] = "4";
        T1.Rows.Add(T1_ROW);

        comboBox1.DataSource = T1;
        comboBox1.DisplayMember = "T";
        comboBox1.ValueMember = "V";

        m_Currency = this.BindingContext[m_ds, "T1"] as CurrencyManager;

        DataTable T2 = m_ds.Tables.Add("T2");
        T2.Columns.Add("ID");
        T2.Columns.Add("T");
        T2.Columns.Add("V");

        DataRow T2_ROW = T2.NewRow();
        T2_ROW["ID"] = "1";
        T2_ROW["T"] = "1-1";
        T2_ROW["V"] = "1-1";
        T2.Rows.Add(T2_ROW);

        T2_ROW = T2.NewRow();
        T2_ROW["ID"] = "1";
        T2_ROW["T"] = "1-2";
        T2_ROW["V"] = "1-2";
        T2.Rows.Add(T2_ROW);

        T2_ROW = T2.NewRow();
        T2_ROW["ID"] = "1";
        T2_ROW["T"] = "1-3";
        T2_ROW["V"] = "1-3";
        T2.Rows.Add(T2_ROW);

        T2_ROW = T2.NewRow();
        T2_ROW["ID"] = "1";
        T2_ROW["T"] = "1-4";
        T2_ROW["V"] = "1-4";
        T2.Rows.Add(T2_ROW);

        T2_ROW = T2.NewRow();
        T2_ROW["ID"] = "2";
        T2_ROW["T"] = "2-1";
        T2_ROW["V"] = "2-1";
        T2.Rows.Add(T2_ROW);

        T2_ROW = T2.NewRow();
        T2_ROW["ID"] = "2";
        T2_ROW["T"] = "2-2";
        T2_ROW["V"] = "2-2";
        T2.Rows.Add(T2_ROW);

        T2_ROW = T2.NewRow();
        T2_ROW["ID"] = "2";
        T2_ROW["T"] = "2-3";
        T2_ROW["V"] = "2-3";
        T2.Rows.Add(T2_ROW);

        T2_ROW = T2.NewRow();
        T2_ROW["ID"] = "2";
        T2_ROW["T"] = "2-4";
        T2_ROW["V"] = "2-4";
        T2.Rows.Add(T2_ROW);

        T2_ROW = T2.NewRow();
        T2_ROW["ID"] = "3";
        T2_ROW["T"] = "3-1";
        T2_ROW["V"] = "3-1";
        T2.Rows.Add(T2_ROW);

        T2_ROW = T2.NewRow();
        T2_ROW["ID"] = "3";
        T2_ROW["T"] = "3-2";
        T2_ROW["V"] = "3-2";
        T2.Rows.Add(T2_ROW);

        T2_ROW = T2.NewRow();
        T2_ROW["ID"] = "3";
        T2_ROW["T"] = "3-3";
        T2_ROW["V"] = "3-3";
        T2.Rows.Add(T2_ROW);

        T2_ROW = T2.NewRow();
        T2_ROW["ID"] = "3";
        T2_ROW["T"] = "3-4";
        T2_ROW["V"] = "3-4";
        T2.Rows.Add(T2_ROW);

        T2_ROW = T2.NewRow();
        T2_ROW["ID"] = "4";
        T2_ROW["T"] = "4-1";
        T2_ROW["V"] = "4-1";
        T2.Rows.Add(T2_ROW);

        T2_ROW = T2.NewRow();
        T2_ROW["ID"] = "4";
        T2_ROW["T"] = "4-2";
        T2_ROW["V"] = "4-2";
        T2.Rows.Add(T2_ROW);

        T2_ROW = T2.NewRow();
        T2_ROW["ID"] = "4";
        T2_ROW["T"] = "4-3";
        T2_ROW["V"] = "4-3";
        T2.Rows.Add(T2_ROW);

        T2_ROW = T2.NewRow();
        T2_ROW["ID"] = "4";
        T2_ROW["T"] = "4-4";
        T2_ROW["V"] = "4-4";
        T2.Rows.Add(T2_ROW);

        System.Data.DataColumn T1_V = null;
        System.Data.DataColumn T2_V = null;
        T1_V = m_ds.Tables["T1"].Columns["V"];
        T2_V = m_ds.Tables["T2"].Columns["ID"];
        System.Data.DataRelation REL = new DataRelation("COM_ID", T1_V, T2_V);
        m_ds.Relations.Add(REL);

        comboBox2.DataSource = m_ds;
        comboBox2.DisplayMember = "T1.COM_ID.T";
        comboBox2.DisplayMember = "T1.COM_ID.V";
    }

    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        DataRow[] Rows = m_ds.Tables["T1"].Select("V = '" + Convert.ToString(comboBox1.SelectedValue) + "'");
        if (Rows.Count() < 1)
            return;

        m_Currency.Position = m_ds.Tables["T1"].Rows.IndexOf(Rows[0]);
    }

答案 7 :(得分:0)

Shaibu,我知道为时已晚,但它可能会帮助某人 只需添加此行代码cmbDevice1.Items.Clear(); 在此行之前cmbDevice1.Items.Add(myReader2 [“”]);