如何从数据库中加载ComboBox的列表?

3

我有一条SQL语句,但不确定如何实现它以便在WinForms应用程序中使用它来填充组合框。

这是我在之前的应用程序中使用的方式:

<asp:SqlDataSource ID="Sections" runat="server" ConnectionString="<%$ ConnectionStrings:MyConnection%>" 
            SelectCommand="SELECT e.DisplayName,  e.ID , e.GUID
            FROM ATable e
            INNER JOIN RootTable re
            ON e.ID = re.TablesID
            AND re.InitID = 1">
</asp:SqlDataSource>

如何修改以适应WinForms组合框

----更新----

在实施下面的建议后,编译时出现错误,指出该方法必须是非泛型静态类。

代码:

public partial class InfoGet : Form
    {
        public InfoGet()
        {
            InitializeComponent();
        }
        static string conString = "Data Source=.;Initial Catalog=MyConnection;Integrated Security=True";
        public static void FillDropDownList(this ComboBox sections_drp, string conString)
        {
            using (SqlConnection con = new SqlConnection(conString))
            {
                con.Open();
                using(SqlDataAdapter sda = new SqlDataAdapter("SELECT....", conString))
                {
                    DataTable dt = new DataTable();
                    sda.Fill(dt);

                    sections_drp.ValueMember = "ID";
                    sections_drp.DisplayMember = "DisplayName";
                    sections_drp.DataSource = dt;
                }
            }

        }
    }
1个回答

1
在Windows Forms应用程序中,您将需要使用代码去获取它,或者至少这是我要推荐的。一种可能的方法是:
using (SqlConnection cnn = new SqlConnection(connString))
{
    cnn.Open();
    using (SqlDataAdapter sda = new SqlDataAdapater("SELECT e.DisplayName,  e.ID , e.GUID FROM ATable e INNER JOIN RootTable re ON e.ID = re.TablesID AND re.InitID = 1", cnn))
    {
        DataTable dt = new DataTable();
        sda.Fill(dt);

        comboBox.ValueMember = "ID";
        comboBox.DisplayMember = "DisplayName";
        comboBox.DataSource = dt;
    }
}

现在,为了使这段代码可重用,您可以构建一个类似于这样的扩展方法:
namespace System.Windows.Forms
{
    public static class ComboBoxExtensions
    {
        public static void Load(this ComboBox comboBox, string sql, string valueMember, string displayMember)
        {
            using (SqlConnection cnn = new SqlConnection(connString))
            {
                cnn.Open();
                using (SqlDataAdapter sda = new SqlDataAdapater(sql, cnn))
                {
                    DataTable dt = new DataTable();
                    sda.Fill(dt);

                    comboBox.ValueMember = valueMember;
                    comboBox.DisplayMember = displayMember;
                    comboBox.DataSource = dt;
                }
            }
        }
    }
}

使用这个扩展方法很容易实现:
comboBox.Load("SELECT e.DisplayName,  e.ID , e.GUID FROM ATable e INNER JOIN RootTable re ON e.ID = re.TablesID AND re.InitID = 1",
    "ID",
    "DisplayName");

@Masriyah,你在.cs文件的顶部有适当的using语句吗? - Mike Perrenoud
@Masriyah,你没有实现我给你的内容。这是一个需要在自己的.cs文件中实现的扩展方法。创建一个名为ComboBoxExtensions的新.cs文件,并复制我提供给你的整个示例 - Mike Perrenoud
我明白了,抱歉我太激动想尝试它了。 - Masriyah
谢谢你的帮助 - 它非常有效。现在,如果我想将组合框中选择的值传递到另一个选择语句中,该语句将根据第一个组合框的ID填充另一个组合框 - 我该如何将该值传递到选择语句中? - Masriyah
@Masriyah,先试试,如果有问题再提出新的问题。但是请确保你已经做了一些真正的努力,这样你就有一些代码可以展示了。 - Mike Perrenoud
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接