【问题标题】:Load a list from a SQL Server database to C# combobox将列表从 SQL Server 数据库加载到 C# 组合框
【发布时间】:2014-12-06 20:02:48
【问题描述】:

我有一个包含 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;
}

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

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

知道如何解决这个问题吗?

【问题讨论】:

  • 提示:CatAlist 的 cmdtxt 可以是 select distinct CatA from category。所以cpu不必做这项工作。你能发布OnSelectionChanged 代码吗,这似乎比SQL 代码更相关。
  • @RadioSpace 现在有问题,视觉工作室不知何故杀死了代码,或多或少的 onselection 更改 comboB.datasoure=getCatBlist(comboA.text);
  • @T.S.做改变但不是很多,我可以重新考虑它只做一次,如果我添加新的加载必须重新加载。或者可能会添加带有命令的刷新按钮来更新全局列表。

标签: c# sql combobox datasource


【解决方案1】:

如果您的类别不是很动态,您可以创建存储过程,您可以在其中进行 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

就是这样

【讨论】:

    猜你喜欢
    • 2016-02-04
    • 2016-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多