如何根据C#中TabControl-TabPages中的ProductType过滤显示的产品

时间:2013-08-15 05:58:14

标签: c# sql-server

我一直在youtube上关注本教程并陷入其中。

在这里,我必须根据产品的类型在TabControl标签页上动态显示我的数据库中的产品,但我似乎无法根据标签页产品类型过滤产品,所有产品都显示在每种产品类型上下面。

请参阅下面的数据库和应用程序的屏幕截图,我们将非常感谢您对此问题的任何帮助。

enter image description here

enter image description here

将产品类型显示为标签页的代码

private void CreateTabPages()
        {
            con.Open();
            SqlDataAdapter sda = new SqlDataAdapter("SELECT DISTINCT ProductType, Description FROM TblProductType", con);
            DataTable dt = new DataTable();
            sda.Fill(dt);

            foreach (DataRow dr in dt.Rows)
            {
                tabControl1.TabPages.Add(dr["ProductType"].ToString(),dr["Description"].ToString());
            }

            //var tabID = (from DataRow dr in dt.Rows
                         // select (Int32)dr["TabID"]).Distinct();
            con.Close();

更新了显示产品的代码

private void AddProductsToTabbedPanel()
    {
        foreach (TabPage tp in tabControl1.TabPages)
        {
            con.Open();
            SqlDataAdapter sdaProductType = new SqlDataAdapter("SELECT ProductType FROM TblProductType WHERE Description =" + tp.Text, con);
            DataTable dtForProductType = new DataTable();
            sdaProductType.Fill(dtForProductType);
            string currentProductType = (string)dtForProductType.Rows[0]["ProductType"];
            SqlDataAdapter sda = new SqlDataAdapter("SELECT DISTINCT Description FROM TblProduct WHERE ProductType =" + currentProductType, con);
            DataTable dt = new DataTable();
            sda.Fill(dt);

            FlowLayoutPanel flp = new FlowLayoutPanel();
            flp.Dock = DockStyle.Fill;

            foreach (DataRow dr in dt.Rows)
            {
                Button b = new Button();
                b.Size = new Size(100, 100);
                b.Text = dr["Description"].ToString();
                flp.Controls.Add(b);
            }

            tp.Controls.Add(flp);
            con.Close();
        }
    }

4 个答案:

答案 0 :(得分:2)

除了在应用程序中构建动态SQL文本的非常危险的方法(对“SQL注入”进行Web搜索)之外,用于向选项卡添加产品的SQL是错误的。

具体来说,这一行(为了便于阅读而增加了换行符):

SqlDataAdapter sda = new SqlDataAdapter(@"
    SELECT DISTINCT Description 
    FROM TblProducts 
    WHERE Description IN ProductType = " + i.ToString(), con);

你可能想要的是:

SqlDataAdapter sda = new SqlDataAdapter(@"
    SELECT DISTINCT Description 
    FROM TblProducts 
    WHERE ProductType = " + i.ToString(), con);

我不知道你在这个上下文中从哪里得到i,也许你应该在循环它们时阅读当前标签的某些属性?常见的hack曾经是Tag属性。

<强>更新

创建标签时尝试保存产品类型:

foreach (DataRow dr in dt.Rows)
{
    var tabPage = new TabPage(dr["Description"].ToString());
    tabPage.Tag = dr["ProductType"].ToString();
    tabControl1.TabPages.Add(tabPage);
}

现在您可以访问当前标签的产品类型,因此在您填充每个页面的循环中:

foreach (TabPage tp in tabControl1.TabPages)
{
    string productTypeID = (string)tp.Tag;
    // other code...
    SqlDataAdapter sda = new SqlDataAdapter(@"
        SELECT DISTINCT Description 
        FROM TblProducts 
        WHERE ProductType = " + productTypeID, con);
    // rest of your code...
}

感觉有点脏,但这就是我们多年来在WinForms中做事的方式,将自定义数据放在控件的Tag属性中。

答案 1 :(得分:1)

主要问题是您没有过滤填充tabPage时使用的查询。

您需要做的是首先获取当前TabPage所代表的 ProductType 。在这里,我刚刚在DB中添加了按ProductType过滤产品的查询。

foreach (TabPage tp in tabControl1.TabPages)
            {
                con.Open();
                SqlDataAdapter sdaProductType =  new SqlDataAdapter("SELECT ProductType FROM TblProductType WHERE Description =\"" + tp.Text + "\"", con);
                DataTable dtForProductType = new DataTable();
                sdaProductType.Fill(dtForProductType);
                string currentProductType = dtForProductType.Rows[0]["ProductType"];
                SqlDataAdapter sda = new SqlDataAdapter("SELECT DISTINCT Description FROM TblProducts WHERE ProductType =" + currentProductType, con);
                DataTable dt = new DataTable();
                sda.Fill(dt);

                FlowLayoutPanel flp = new FlowLayoutPanel();
                flp.Dock = DockStyle.Fill;

                foreach (DataRow dr in dt.Rows)
                {
                    Button b = new Button();
                    b.Size = new Size(100, 100);
                    b.Text = dr["Description"].ToString(); 
                    flp.Controls.Add(b);
                }

                tp.Controls.Add(flp);
                con.Close();
            }

currentProductType 是当前TabPage表示的ProductType。我使用TabPage的 Text 属性来检索正确的ProductType,以用作第二个查询的过滤器,以填充TabPage。

希望有所帮助。

答案 2 :(得分:0)

将您的ProductType列数据类型更改为int,以便您可以使用foreach语句循环查看要查看的数据。

这是代码。

 private void AddProductsToPannel()
    {
        int i = 1;
        foreach (TabPage tp in tabcon_ProductList.TabPages)
        {
            connection.Open();
            OleDbDataAdapter da = new OleDbDataAdapter("SELECT DISTINCT Description FROM Tbl_Product Where ProductType =" + i, connection);
            DataTable dt = new DataTable();
            da.Fill(dt);

            FlowLayoutPanel flowLayout = new FlowLayoutPanel();
            flowLayout.Dock = DockStyle.Fill;

            foreach (DataRow dr in dt.Rows)
            {
                Button b = new Button();
                b.Size = new Size(100, 100);
                b.Text = dr["Description"].ToString(); 
                flowLayout.Controls.Add(b);
            }

            tp.Controls.Add(flowLayout);
            connection.Close();
            i++;

        }

希望这会对某人有所帮助。

答案 3 :(得分:0)

我知道回答这个问题为时已晚,但希望这可以帮助将来面临同样问题的其他人。

这是我的代码:

$request->attributes->get('_route');