问题 根据组合框选择将数据加载到dataGridView中

安德鲁·马努亚

知名会员
已加入
五月30,2019
留言内容
75
编程经验
Beginner
你好,
我有一个组合框和一个datagridview,我的要求是,根据用户在组合框中选择的一项(类别名称),将相应的产品详细信息填充到dataGrid视图中。

我在SQL Server中得到了两个表,分别为tbl_Product(产品ID,ProductName和CategoryID)和tbl_Category(CategoryID,CategoryName)。

我的表单加载事件如下所示;
Form_Load event:
dataGridViewProducts.Rows.Clear();
            dataGridViewProducts.Rows.Clear();
            string query = "SELECT CategoryID, CategoryName FROM tbl_Category";
            comboBoxCategory.DataSource = getData(query);
            comboBoxCategory.DisplayMember = "CategoryName";
            comboBoxCategory.ValueMember = "CategoryID";

            comboBoxCategory_SelectedIndexChanged(null, null);

组合框selectedindexchange事件如下所示;
SelectedIndexChange事件:
             int val;          
            Int32.TryParse(comboBoxCategory.SelectedValue.ToString(), out val);                      
            string query = "SELECT ProductID, ProductName,CategoryID  FROM tbl_Product WHERE CategoryID ="+val ;
            dataGridViewProducts.DataSource = getData(query);

最后,我得到了一个名为"GetData"调用sql命令

Function:
 cmd = new SqlCommand(query,con);
            sda = new SqlDataAdapter(cmd);
            dt = new DataTable();
            sda.Fill(dt);
            return dt;

尽管应用程序运行没有错误,但我只得到与"CategoryID =1",尽管我更改了"CategoryName"组合框中的值不更改dataGridView数据。

非常感谢您为解决此问题提供的宝贵帮助。

亲切的问候,

安德鲁
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,532
地点
弗吉尼亚州切萨皮克
编程经验
10+
首先。始终使用参数化查询。在这种情况下,可能会很想自己构建字符串,因为您可以完全控制要构建的字符串的输入,但是如果将来有人决定将下拉组合框变成普通的组合框或文本框,该怎么办?允许用户输入自由格式的文本?还是如果发生足够的重构,您不知道输入来自何处? (例如,数据访问代码不应直接访问UI,但您已经在上面进行了访问-应该将其重构。)

Anyway do you know that the TryParse() is always succeeding? What do the failing/empty queries look like? What does the succeeding look like?
 

安德鲁·马努亚

知名会员
已加入
五月30,2019
留言内容
75
编程经验
Beginner
你好,

是的,上述结果查询看起来像,"从tbl_Product WHERE CategoryID = 1中选择产品ID,产品名称,类别ID".

意思是,尽管表中有3行CategoryID,它是否仅选择一行数据/第一行?

问候,

安德鲁
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,524
地点
悉尼,澳大利亚
编程经验
10+
除非您有大量数据,否则我建议您先将其全部收集,然后在本地进行过滤。将整个tbl_Product表获取到DataTable中,将其绑定到BindingSource并将其绑定到DataGridView。当用户进行选择时,请相应地设置BindingSource的Filter。

顺便说一句,摆脱对comboBoxCategory_SelectedIndexChanged的直接调用。您永远不应直接调用事件处理程序。首先设置DisplayMember和ValueMember,最后设置DataSource,无论如何都会引发SelectedIndex事件,因此您的事件处理程序将已经执行。
 
最佳 底部