0

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

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

请参阅下面的屏幕截图以获取数据库和应用程序,我们将不胜感激有关此问题的任何帮助。

在此处输入图像描述

在此处输入图像描述

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

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

4 回答 4

2

除了在您的应用程序中构建动态 SQL 文本的非常危险的方法(在网络上搜索“SQL 注入”)之外,您将产品添加到选项卡的 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在这种情况下你从哪里得到,也许你应该在循环浏览它们时阅读当前选项卡的某些属性?一个常见的黑客曾经是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 属性中。

于 2013-08-15T06:15:08.170 回答
1

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

您需要做的是首先获取当前 TabPage 代表的ProductType 。在这里,我只是在数据库中添加了按 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 的第二个查询的过滤器。

希望有帮助。

于 2013-08-15T07:10:35.003 回答
0

将您的 ProductType Column 数据类型更改为,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++;

        }

希望这对某人有帮助。

于 2015-05-12T18:22:14.747 回答
0

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

这是我的代码:

private void AddProductsToTabbedPanel()
    {
        int i = 1;

        foreach (TabPage tp in tabControl1.TabPages)
        {
            con.Open();
            SqlDataAdapter sdaProductType = new SqlDataAdapter("SELECT Description FROM TblProducts WHERE ProductType =" + i.ToString(), con);

            FlowLayoutPanel flp = new FlowLayoutPanel();
            flp.Dock = DockStyle.Fill;
            DataTable dt = new DataTable();
            sdaProductType.Fill(dt);

            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);
            i++;
            con.Close();
        }
    }
于 2016-12-30T08:16:17.337 回答