将SQL Server数据库中的列表加载到C#组合框

时间:2014-10-11 22:33:48

标签: c# sql combobox datasource

我有一个包含2个类别的数据库,我将其转换为列表并计划将其用作C#中下拉组合框的数据源

类别B例如连接到类别B(在数据库中):

CatA CatB
a     1
a     2
b     3
b     4

计划是使用droplist选择catA,在更改时它会将CatB加载到第二个droplist。

因此,如果我选择CATA = a,我将获得CATB = 1,2

获取CATA的代码

public List<string> getCatAlist()
{
    List<string> catAlist = new List<string>();
    List<string> filteredList = new List<string>();

    _con.Open(); 
    _cmd.CommandText = "SELECT * FROM category";

    var dr = _cmd.ExecuteReader();

    while (dr.Read())
        catAlist.Add(dr["catA"].ToString());

    _con.Close();
    filteredList = catAlist.Distinct().ToList();
    return filteredList;
}

获取CATB的代码

public List<string> getCatBlist(string catA)
{
    List<string> catBlist = new List<string>();

    _con.Open();
    _cmd.CommandText = "SELECT * FROM category WHERE catA='"+catA+"';";

    var dr = _cmd.ExecuteReader();

    while (dr.Read())
        catBlist.Add(dr["catB"].ToString());

    _con.Close();

    return catBlist;
}

问题是将列表设置为组合框的数据源

我打开与数据库的连接,并在第一次运行时加载列表,但是当我再次尝试使用它时,它会将其转换为数据源的静态列表。

有关如何解决这个问题的想法吗?

1 个答案:

答案 0 :(得分:0)

如果您的类别不是非常动态,您可以创建存储过程,在其中进行2次调用 - 这是可选的,您可以对DB进行两次单独的调用

Select ... From Cat...
Select ... From Cat...

在.Net使用

cmd.ExecuteReader

并使用

reader.NextResult

...检索每组记录。 为您的类别创建类(伪代码)

class CatA {
    int value
    string display
}

class CatB {
    int parent
    int value
    string display
}

填写您的清单

List<CatA> listA;
List<CatA> listB;

设置CatA组合属性

cboA.valuemember = "value";
cboA.displaymember = "display";
cboA.datasource = listA; // set DS last for better performance

现在,您可以在listA SelectedIndexChanged

上执行此操作
// Read comment 
var subListCatB = listB.Where(i => i.parent == ((CatA)listA.SelectedItem).value).ToList() 
//I think you need to use 'where' here but if you have A, which has no B then you need null check

cboB.valuemember = "value";
cboB.displaymember = "display";
cboB.datasource = subListCatB ; // set DS last for better performance

这就是它