2016-04-11 7 views
0

Ich habe eine TreeView und auf eine separate . Die Treeview Daten aus einer Datenbank gezogen werden, hat diese Datenbank zwei Tabellen Product und Model in dem Model Tisch gibt es 3 columns - twoDoor, threeDoor und fiveDoor. Mein TreeView sieht so aus;Füllen Sie die Kontrollkästchen je nach Child-Knoten aus Baumansicht

CAR(PRODUCT) 
->FORD(MODEL) 
->BMW(MODEL) 
->VW(MODEL) 

Auf einem separaten Panel befinden sich 3 checkboxes;

  • Two Door
  • Drei Tür
  • Fünf Tür

Der Zustand dieser checkboxes bereits in der Model db definiert sind. Wie kann ich ihren Status gegen den untergeordneten Knoten (Modell) in der TreeView angezeigt werden?

Mein Code:

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

Wie sehen Sie Ihre Baumansicht füllen, das heißt es gibt einige Assoziation zwischen 'TreeNode' und'-Produkt mit/'Modell 'Klassen? –

+0

Hallo Danke für die Antwort, Ja ich habe ein Product.cs und Model.cs – AndroidAL

+0

Hallo. Ich meine, wenn Sie Knoten erstellen, legen Sie die Objekte, die Sie benutzen, irgendwo hin - zum Beispiel im Knoten "Tag"? –

Antwort

1

Hier ist, was Sie tun können, wenn ich die Frage richtig zu verstehen.

zunächst eine Klasse erstellen Sie Ihre Model Informationen zu halten:

class ModelInfo 
{ 
    public string Name { get; set; } 
    public bool TwoDoor { get; set; } 
    public bool ThreeDoor { get; set; } 
    public bool FiveDoor { get; set; } 
} 

Zweitens ändern Sie Ihre PopulateTreeView Methode wie folgt:

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; 
    } 

    // ...    
} 

Der wesentliche Teil ist die ModelInfo innerhalb der Node.Tag Eigenschaft zu speichern, damit es später abgerufen werden kann.

Schließlich abonnieren Sie das TreeView.AfterSelect Ereignis und innerhalb der Event-Handler etwas so:

// 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; 

für den Zwei-Staaten-Checkbox Stil, oder alternativ

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; 

für das Tri-State Kontrollkästchenstil

+0

Danke, Ivan, wenn ich auf einen' 'ParentNode' klicke, wirft es eine' NullReferenceException'? – AndroidAL

+0

Hoppla, tut mir leid, der Zustand war falsch - ich dachte daran, einen Code für den Tri State aufzunehmen, entschied mich dann aber nicht und verwarf natürlich den falschen Zustand. Natürlich sollte es "! = Null && ..." sein. –

+0

Danke, könntest du eine Bedingung für Tri State bearbeiten? – AndroidAL

Verwandte Themen