我有一个包含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;
}
问题是将列表设置为组合框的数据源
我打开与数据库的连接,并在第一次运行时加载列表,但是当我再次尝试使用它时,它会将其转换为数据源的静态列表。
有关如何解决这个问题的想法吗?
答案 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
这就是它