根据从树视图中选择的子节点填充复选框

Populate checkboxes depending on child node picked from treeview

我有一个 TreeView 和一个单独的 panel 3 checkboxes。 正在从数据库中提取 Treeview 数据,该数据库有两个 tables ProductModelModel table 中有 3 个 columns - twoDoorthreeDoorfiveDoor。 我的 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;

用于三态复选框样式。