2014-10-11 60 views
0

我有2个类别,我变成一个列表,并打算使用它作为数据源的下拉组合框在C#负载从一个SQL Server数据库C#组合框列表

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

CatA CatB 
a  1 
a  2 
b  3 
b  4 

的计划是使用droplist选择CATA和变化它会加载中CatB到第二droplist。

所以,如果我选择CATA =一个我会得到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; 
} 

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

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

关于如何解决这个问题的任何想法?

+0

提示:catAlist的cmdtxt可以从类别中选择不同的CatA。所以CPU不必这样做。你可以发布'OnSelectionChanged'代码,这看起来比SQL代码更相关。 – RadioSpace 2014-10-11 23:08:28

+0

@RadioSpace现在有问题,视觉工作室以某种方式杀死代码,或多或少的选择更改comboB.datasoure = getCatBlist(comboA.text); – Iakovl 2014-10-11 23:23:55

+0

@ T.S。做的变化,但不是很多,我可以重新考虑它只做一次,而加载不得不重新加载,如果我添加新的。或者可以添加刷新按钮和命令来更新全局列表。 – Iakovl 2014-10-11 23:25:04

回答

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 

,你可以做到这一点listASelectedIndexChanged

// 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 

这就是它

+0

我会尽量迟到,但听起来像是一个不错的选择 – Iakovl 2014-10-12 00:12:27