我一直在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();
}
}
答案 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');