根据从树视图中选择的子节点填充复选框
Populate checkboxes depending on child node picked from treeview
我有一个 TreeView
和一个单独的 panel
3 checkboxes
。
正在从数据库中提取 Treeview 数据,该数据库有两个 tables Product
和 Model
在 Model
table 中有 3 个 columns
- twoDoor
、threeDoor
和 fiveDoor
。
我的 TreeView 看起来像这样;
CAR(PRODUCT)
->FORD(MODEL)
->BMW(MODEL)
->VW(MODEL)
在单独的面板上有 3 个 checkboxes
;
- 双门
- 三门
- 五门
这些 checkboxes
的状态已经在 Model
数据库中定义。
我如何根据在 TreeView
中选择的任何子节点(模型)显示它们的状态?
我的代码:
private void Form1_Options_Load(object sender, EventArgs e)
{
String connectionString;
connectionString = ConfigurationManager.ConnectionStrings["myConnectionString"].ConnectionString;
conn = new SqlConnection(connectionString);
String Sequel = "SELECT id,ProductName,ModelType FROM Product";
SqlDataAdapter da = new SqlDataAdapter(Sequel, conn);
DataTable dt = new DataTable();
conn.Open();
da.Fill(dt);
foreach (DataRow dr in dt.Rows)
{
parentNode = treeView1.Nodes.Add(dr["ProductName"].ToString());
//treeView1.Nodes.Add(dr["ModelType"].ToString());
PopulateTreeView(Convert.ToInt32(dr["Id"].ToString()), parentNode);
}
}
public void PopulateTreeView(int parentId, TreeNode parentNode)
{
String Seqchildc = "Select * From Model WHERE ProductId = "+ parentId + "";
SqlDataAdapter dachildmnuc = new SqlDataAdapter(Seqchildc, conn);
DataTable dtchildc = new DataTable();
dachildmnuc.Fill(dtchildc);
TreeNode childNode;
foreach (DataRow dr in dtchildc.Rows)
{
if (parentNode == null)
childNode = treeView1.Nodes.Add(dr["ModelName"].ToString());
//childNode.Nodes.Add(dr["ModelType"].ToString());
else
childNode = parentNode.Nodes.Add(dr["ModelName"].ToString());
//PopulateTreeView(Convert.ToInt32(dr["Id"].ToString()), childNode);
}
treeView1.ExpandAll();
//Connect();
}
如果我正确理解问题,您可以执行以下操作。
首先,创建一个 class 来保存您的 Model
信息:
class ModelInfo
{
public string Name { get; set; }
public bool TwoDoor { get; set; }
public bool ThreeDoor { get; set; }
public bool FiveDoor { get; set; }
}
其次,修改你的PopulateTreeView
方法如下:
public void PopulateTreeView(int parentId, TreeNode parentNode)
{
// ...
foreach (DataRow dr in dtchildc.Rows)
{
// Populate model info from the data
var modelInfo = new ModelInfo { Name = dr["ModelName"].ToString() };
//modelInfo.TwoDoor = dr[...];
//modelInfo.ThreeDoor = dr[...];
//modelInfo.FiveDoor = dr[...];
// Create and add a new node
var childNode = (parentNode == null ? treeView1.Nodes : parentNode.Nodes).Add(modelInfo.Name);
// Associate info with the node
childNode.Tag = modelInfo;
}
// ...
}
关键部分是将 ModelInfo
存储在 Node.Tag
属性 中,以便稍后检索。
最后,订阅 TreeView.AfterSelect 事件并在事件处理程序中放入如下内容:
// Get the model info from the selected node
var modelInfo = e.Node != null ? e.Node.Tag as ModelInfo : null;
// Update the checkboxes accordingly
chkTwoDoor.Checked = modelInfo != null && modelInfo.TwoDoor;
chkThreeDoor.Checked = modelInfo != null && modelInfo.ThreeDoor;
chkFiveDoor.Checked = modelInfo != null && modelInfo.FiveDoor;
用于双态复选框样式,或者
chkTwoDoor.CheckState = modelInfo == null ? CheckState.Indeterminate : modelInfo.TwoDoor ? CheckState.Checked : CheckState.Unchecked;
chkThreeDoor.CheckState = modelInfo == null ? CheckState.Indeterminate : modelInfo.ThreeDoor ? CheckState.Checked : CheckState.Unchecked;
chkFiveDoor.CheckState = modelInfo == null ? CheckState.Indeterminate : modelInfo.FiveDoor ? CheckState.Checked : CheckState.Unchecked;
用于三态复选框样式。
我有一个 TreeView
和一个单独的 panel
3 checkboxes
。
正在从数据库中提取 Treeview 数据,该数据库有两个 tables Product
和 Model
在 Model
table 中有 3 个 columns
- twoDoor
、threeDoor
和 fiveDoor
。
我的 TreeView 看起来像这样;
CAR(PRODUCT)
->FORD(MODEL)
->BMW(MODEL)
->VW(MODEL)
在单独的面板上有 3 个 checkboxes
;
- 双门
- 三门
- 五门
这些 checkboxes
的状态已经在 Model
数据库中定义。
我如何根据在 TreeView
中选择的任何子节点(模型)显示它们的状态?
我的代码:
private void Form1_Options_Load(object sender, EventArgs e)
{
String connectionString;
connectionString = ConfigurationManager.ConnectionStrings["myConnectionString"].ConnectionString;
conn = new SqlConnection(connectionString);
String Sequel = "SELECT id,ProductName,ModelType FROM Product";
SqlDataAdapter da = new SqlDataAdapter(Sequel, conn);
DataTable dt = new DataTable();
conn.Open();
da.Fill(dt);
foreach (DataRow dr in dt.Rows)
{
parentNode = treeView1.Nodes.Add(dr["ProductName"].ToString());
//treeView1.Nodes.Add(dr["ModelType"].ToString());
PopulateTreeView(Convert.ToInt32(dr["Id"].ToString()), parentNode);
}
}
public void PopulateTreeView(int parentId, TreeNode parentNode)
{
String Seqchildc = "Select * From Model WHERE ProductId = "+ parentId + "";
SqlDataAdapter dachildmnuc = new SqlDataAdapter(Seqchildc, conn);
DataTable dtchildc = new DataTable();
dachildmnuc.Fill(dtchildc);
TreeNode childNode;
foreach (DataRow dr in dtchildc.Rows)
{
if (parentNode == null)
childNode = treeView1.Nodes.Add(dr["ModelName"].ToString());
//childNode.Nodes.Add(dr["ModelType"].ToString());
else
childNode = parentNode.Nodes.Add(dr["ModelName"].ToString());
//PopulateTreeView(Convert.ToInt32(dr["Id"].ToString()), childNode);
}
treeView1.ExpandAll();
//Connect();
}
如果我正确理解问题,您可以执行以下操作。
首先,创建一个 class 来保存您的 Model
信息:
class ModelInfo
{
public string Name { get; set; }
public bool TwoDoor { get; set; }
public bool ThreeDoor { get; set; }
public bool FiveDoor { get; set; }
}
其次,修改你的PopulateTreeView
方法如下:
public void PopulateTreeView(int parentId, TreeNode parentNode)
{
// ...
foreach (DataRow dr in dtchildc.Rows)
{
// Populate model info from the data
var modelInfo = new ModelInfo { Name = dr["ModelName"].ToString() };
//modelInfo.TwoDoor = dr[...];
//modelInfo.ThreeDoor = dr[...];
//modelInfo.FiveDoor = dr[...];
// Create and add a new node
var childNode = (parentNode == null ? treeView1.Nodes : parentNode.Nodes).Add(modelInfo.Name);
// Associate info with the node
childNode.Tag = modelInfo;
}
// ...
}
关键部分是将 ModelInfo
存储在 Node.Tag
属性 中,以便稍后检索。
最后,订阅 TreeView.AfterSelect 事件并在事件处理程序中放入如下内容:
// Get the model info from the selected node
var modelInfo = e.Node != null ? e.Node.Tag as ModelInfo : null;
// Update the checkboxes accordingly
chkTwoDoor.Checked = modelInfo != null && modelInfo.TwoDoor;
chkThreeDoor.Checked = modelInfo != null && modelInfo.ThreeDoor;
chkFiveDoor.Checked = modelInfo != null && modelInfo.FiveDoor;
用于双态复选框样式,或者
chkTwoDoor.CheckState = modelInfo == null ? CheckState.Indeterminate : modelInfo.TwoDoor ? CheckState.Checked : CheckState.Unchecked;
chkThreeDoor.CheckState = modelInfo == null ? CheckState.Indeterminate : modelInfo.ThreeDoor ? CheckState.Checked : CheckState.Unchecked;
chkFiveDoor.CheckState = modelInfo == null ? CheckState.Indeterminate : modelInfo.FiveDoor ? CheckState.Checked : CheckState.Unchecked;
用于三态复选框样式。