2010-11-22 7 views
3

J'ai un contrôle TreeView (qui devrait ressembler à ceci)Comment remplir un TreeViewControl avec un niveau hiérarchique?

alt text

Mais je ne sais pas comment le remplir avec ma requête:

SELECT T.TableName, C.Column_Name FROM Information_Schema.Tables T 
INNER JOIN Information_Schema.Columns C 
ON T.TableName= C.TableName 
WHERE T.TableName IN('BASE_TABLE', 'BASE TABLE') 
ORDER BY 1, C.Ordinal_Position 

Quelqu'un peut-il me aider s'il vous plaît. ..

Merci.

Modifier C'est ce que j'ai essayé, mais juste les noms de table ...

private void PopulateTreeView() 
{ 
    SqlCeCommand cmd = new SqlCeCommand(); 
    try 
    { 
     using (SqlCeConnection conn = new SqlCeConnection("Data Source=" + connString)) 
     {    
      cmd.CommandType = CommandType.Text; 
      cmd.CommandText = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES"; 
      conn.Open(); 
      cmd.Connection = conn; 
      cmd.ExecuteNonQuery(); 
      // Don't know what's next... 
     } 
    } 
    catch (Exception x) 
    { 
     MessageBox.Show(x.GetBaseException().ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
    } 
    finally 
    { 
     cmd.Dispose(); 
    } 
} 
+1

LINQ to SQL? LINQ à EF? – Ani

+0

@Ani: Je suis fatigué de poser cette question à chaque fois. –

+0

@yonan: qu'avez-vous déjà essayé? –

Répondre

1

Voici une réponse non-LINQ qui fait quelque chose simmilar:

using (var conn = new SqlCeConnection(connectionString)) 
using (var cmd = conn.CreateCommand()) 
{ 
    cmd.CommandType = CommandType.Text; 
    cmd.CommandText = @" 
SELECT T.TABLE_NAME, C.COLUMN_NAME 
FROM INFORMATION_SCHEMA.TABLES T 
INNER JOIN INFORMATION_SCHEMA.COLUMNS C 
ON T.TABLE_NAME= C.TABLE_NAME 
WHERE T.TABLE_NAME IN('BASE_TABLE', 'BASE TABLE') 
ORDER BY 1, C.ORDINAL_POSITION"; 
    conn.Open(); 
    cmd.Connection = conn; 
    using (var reader = cmd.ExecuteReader()) 
    { 
     string lastTable = null; 
     TreeNode tableNode = null; 
     while (reader.Read()) { 
      if (lastTable != reader.GetString(0)) { 
       lastTable = reader.GetString(0); 
       tableNode = new TreeNode(lastTable); 
       myTree.Nodes.Add(tableNode); 
      } 
      tableNode.ChildNodes.Add(new TreeNode(reader.GetString(1))); 
     } 
    } 
} 
+0

hehe .. Je viens d'éditer une partie de votre code et ça marche maintenant. J'ai déjà posté le code de travail, et changé le titre de cette question. Merci monsieur ... – yonan2236

0

BTW, ne jamais utiliser MessageBox sur un serveur; p

La requête de base LINQ -À-SQL est quelque chose comme:

using (var ctx = new DataClasses1DataContext()) 
{ 
    string[] names = {"BASE_TABLE", "BASE TABLE"}; 
    var qry = (from table in ctx.Tables 
       where names.Contains(table.TableName) 
       join column in ctx.Columns on table.TableName equals column.TableName 
       orderby table.TableName, column.ColumnName 
       select new { table.TableName, column.ColumnName }).ToList(); 
    foreach (var pair in qry.GroupBy(pair => pair.TableName)) 
    { 
     TreeNode tableNode = new TreeNode(pair.Key); 
     myTree.Nodes.Add(tableNode); 
     foreach (var col in pair) 
     { 
      tableNode.ChildNodes.Add(new TreeNode(col.ColumnName)); 
     } 
    } 
} 

Assu ming un main conçu DBML (depuis le concepteur filtre ces tables), le long des lignes de:

<?xml version="1.0" encoding="utf-8"?><Database Name="YourDatabase" Class="DataClasses1DataContext" xmlns="http://schemas.microsoft.com/linqtosql/dbml/2007"> 
    <Connection Mode="WebSettings" ConnectionString="YourConnectionString" SettingsObjectName="System.Configuration.ConfigurationManager.ConnectionStrings" SettingsPropertyName="YourConnectionStringPropertyName" Provider="System.Data.SqlClient" /> 
    <Table Name="INFORMATION_SCHEMA.TABLES" Member="Tables"> 
    <Type Name="Table"> 
     <Column Name="TABLE_NAME" Member="TableName" Type="System.String" DbType="nvarchar(128) NOT NULL" CanBeNull="false" /> 
    </Type> 
    </Table> 
    <Table Name="INFORMATION_SCHEMA.COLUMNS" Member="Columns"> 
    <Type Name="Column"> 
     <Column Name="TABLE_NAME" Member="TableName" Type="System.String" DbType="nvarchar(128) NOT NULL" CanBeNull="false" /> 
     <Column Name="COLUMN_NAME" Member="ColumnName" Type="System.String" DbType="nvarchar(128) NOT NULL" CanBeNull="false" /> 
     <Column Name="ORDINAL_POSITION" Member="OrdinalPosition" Type="System.Int32" DbType="int NOT NULL" CanBeNull="false" /> 
    </Type> 
    </Table> 
</Database> 
+0

ok merci monsieur ... ce n'est pas exactement ce que je veux, mais je peux utiliser votre idée. Je posterai ma réponse dès que je la ferai fonctionner ... – yonan2236

0

C'est la réponse de travail. Je viens d'éditer quelques lignes du code de Sir Gravell

private void PopulateTreeView() 
{ 
    treeView1.Nodes.Clear(); 

    using (var conn = new SqlCeConnection("Data Source=" + connString)) 
    using (var cmd = conn.CreateCommand()) 
    { 
     cmd.CommandType = CommandType.Text; 
     cmd.CommandText = @"SELECT T.TABLE_NAME, C.COLUMN_NAME 
          FROM INFORMATION_SCHEMA.TABLES AS T INNER JOIN 
          Information_Schema.Columns AS C ON T.TABLE_NAME = C.TABLE_NAME 
          WHERE T.TABLE_TYPE IN('BASE_TABLE', 'BASE TABLE', 'TABLE') 
          ORDER BY T.TABLE_NAME, C.ORDINAL_POSITION"; 
     conn.Open(); 
     cmd.Connection = conn; 

     using (var reader = cmd.ExecuteReader()) 
     { 
      string lastTable = null; 
      TreeNode tableNode = null; 
      while (reader.Read()) 
      { 
       if (lastTable != reader.GetString(0)) 
       { 
        lastTable = reader.GetString(0); 
        tableNode = new TreeNode(lastTable); 
        treeView1.Nodes.Add(tableNode); 
       } 
       tableNode.Nodes.Add(new TreeNode(reader.GetString(1))); 
      } 
     } 
    } 
} 
+0

Si vous avez supprimé l'ordre de tri, cela ne fonctionnera probablement pas correctement. Le 'ORDER BY' est critique pour le code que j'ai posté. De plus, mon utilisation en majuscules 'INFORMATION_SCHEMA.COLUMNS' était délibérée, car les bases de données peuvent être (et sont souvent) configurées en mode sensible à la casse. Les noms d'objets ou de colonnes mal placés ne fonctionneront pas. –