2016-04-11 7 views
0

私はTreeViewを持ち、別のを持っています。 twoDoorthreeDoorfiveDoor - ツリービューデータがデータベースからプルされ、このデータベースは、3 columnsがある二つのテーブルModelテーブル内部ProductModelを有しています。 私の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(); 


    } 
+0

ツリービューにはどのようにして埋め込みますか?すなわち、 'TreeNode'と' Product'/'Model'クラスの間に関連がありますか? –

+0

こんにちは、返信ありがとう、はい私はProduct.csとModel.cs – AndroidAL

+0

こんにちは。つまり、ノードを作成するときには、ノードの「タグ」などのどこかで使用するオブジェクトを配置しますか? –

答えて

1

は私が正しく質問を理解していれば、あなたが何ができるかです。

まず、あなたの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; 
    } 

    // ...    
} 

重要な部分はNode.Tagプロパティ内ModelInfoを格納することですしたがって、後で検索することができます。最後に

、このような何か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; 

トライステートについてチェックボックスのスタイル。

+0

ありがとう、Ivan、 '' ParentNode'をクリックすると 'NullReferenceException'がスローされますか? – AndroidAL

+0

おっと、申し訳ありませんが、条件が間違っていました。私はトリステート用のコードを含めることを考えていましたが、そうではないと決めました。もちろん、それは '!= null && ... 'でなければなりません –

+0

ありがとう、トリステートの1つの条件を編集できますか? – AndroidAL

関連する問題