none
WPF - DataGrid RRS feed

  • Frage

  • High peoples,

    bin nicht so super fit und bräuchte mal Hilfe, da ich im Inet trotz zahlreich vorhandener Inhalte bezüglich dieses Themas nicht so richtig fündig geworden bin. Hab ein DataGrid mit den Spalten Benutzer, Client, Akt. IP und MAC.

    <DataGrid x:Name="DataGridClients">
      <DataGrid.Columns>
        <DataGridTextColumn Header="Benutzer" />
        <DataGridTextColumn Header="Client" />
        <DataGridTextColumn Header="Akt. IP" />
        <DataGridTextColumn Header="MAC" />
      </DataGrid.Columns>
    </DataGrid>

    Ich scan anhand der folgenden Methode nach Clients:

    private void btnListClients_Click(object sender, RoutedEventArgs e) { DirectoryEntry root = new DirectoryEntry("WinNT:"); try { foreach (DirectoryEntry dirEntry in root.Children) { foreach (DirectoryEntry dirCl in dirEntry.Children) { this.listBox.Items.Add(dirCl.Name); } } }

    ich habe zu Testzwecken die ListBox genommen, möchte aber, dass die

    Ergebnissse im DataGrid in der Spalte "Clients" aufgelistet werden.

    Hab es mit ItemsSource und items.add probiert aber leider kein Erfolg.

    Hoffe, dass Ihr Lust habt zu helfen.......regards: mradic

     
    Freitag, 4. Januar 2013 12:04

Antworten

  • Hi,
    Du baust eine Klasse “Data”, die ein Datenobjekt repräsentiert. Diese Klasse hat beispielsweise eine Eigenschaft “Client”.
     
    Du deklarierst eine Variable clients, der Du eine Instanz einer Liste mit Datenobjekten zuweist.
     
    Für jeden dirHost erzeugst Du ein neues Objekt vom Typ Datenobjekt, weist der Eigenschaft “Client” den dirHost.Name zu und fügst dieses Objekt der Liste clients zu, z.B. so:
     
    private void btnListClients_Click(object sender, RoutedEventArgs e)
    {
    DirectoryEntry root = new DirectoryEntry("WinNT:");
    try
    {
    List<Data> clients = new List<Data>();
    foreach(DirectoryEntry dirEntry in root.Children)
    {
    foreach(DirectoryEntry dirHost in dirEntry.Children)
    {
    clients.Add(new Data() {Client = dirHost.Name});
    } }
    this.DataGridClients.ItemsSource = clients;
    }
    ...
     
    class Data
    {
    public string Client{get;set;}
    //...}
     
     
    --
    Peter Fleischer
    • Als Antwort vorgeschlagen Peter Fleischer Freitag, 4. Januar 2013 20:14
    • Als Antwort markiert mradic Dienstag, 8. Januar 2013 07:59
    Freitag, 4. Januar 2013 20:12

Alle Antworten

  • Hi,
    nimm an der Stelle, wo Du listBox.Items.Add ausführst ein liste.Add. “liste” ist die Verweisvariable auf eine typisierte Liste, die vor den Schleifen instanziiert wird. Hinzuzufügen ist nicht der Name selbst, sondern ein eigenes Objekt, was den Namen und weitere Eigenschaften enthält (Client, MAC usw.). Diese Liste bindest Du dann an die Oberfläche.
     
    --
    Peter Fleischer
    Freitag, 4. Januar 2013 12:39
  • Vielen Dank für die schnelle Antwort. Es hat sich auf jedenfall was getan. Im DataGrid wird zwar das alles

    tabellarisch angezeigt aber die Zellen sind leer.

    ich hoffe, ich hab es richtig verstanden:

    private void btnListClients_Click(object sender, RoutedEventArgs e)
    {
     DirectoryEntry root = new DirectoryEntry("WinNT:");
      try
       {
        List<string> clients = new List<string>();
         foreach(DirectoryEntry dirEntry in root.Children)
          {
           foreach(DirectoryEntry dirHost in dirEntry.Children)
            {
              clients.Add(dirHost.Name);
            }
          }
          this.DataGridClients.ItemsSource = clients;
        }
    hmmmm......wie gesagt, bin noch nicht so fit. Was hab ich falsch gemacht???
    Freitag, 4. Januar 2013 13:03
  • Hallo, nimm lieber statt List<string> ein List<MyClass>:

    class MyClass
    {
        public string Name{get;set;}
        //...
    }

    In der Du alle Eigenschaften deiner Verbindung speicherst. Diese kannst du dann per DataTemplate im XAMl binden:
    http://www.paulstovell.com/dynamic-datagrid

    Zuweisen des ItemSource usw. solltest du gleich im XAML lösen, das ist meiner Meinung nach übersichtlicher, siehe Link.

    Hinweis: Wenn du den Inhalt des DataGrid's zur Laufzeit automatisch aktualisieren möchtest, dann solltest du INotifyPropertyChanged in MyClass implementieren und anstatt List<T> eine ObservableCollection<T> nehmen. Die Liste musst du als Feld in deiner Klasse speichern. Damit wird dann deine Ansicht automatisch aktualisiert.
    Hier mehr dazu:
    http://stackoverflow.com/questions/4196968/observablecollection-vs-list


    Koopakiller [kuːpakɪllɐ] | Webseite | Code Beispiele | Facebook | Snippets


    Freitag, 4. Januar 2013 13:36
    Moderator
  • Ok....werd ich mal ausprobieren. Hoffe, dass ich da durchblicke (automatische Aktuallisierung)..........was ich mich aber immer noch frage ist,......die Methode, mit der ich in der ActiveDirectory nach Clients suche gibt mir ja nur die Namen der Clients. Wie kann ich diese in der Spalte Clients im DataGrid auflisten??? Geht das über den Spalten-Namen oder index oder (keine Ahnung)???......wenn ich das erstmal mit eurer Hilfe hinbekomme, werde ich auf jedenfall das mit der automatischen aktuallisierung ausprobieren......

    an dieser Stelle ein recht herzliches Dankeschön für eure Antworten......

    Freitag, 4. Januar 2013 13:49
  • Hi,
    Du baust eine Klasse “Data”, die ein Datenobjekt repräsentiert. Diese Klasse hat beispielsweise eine Eigenschaft “Client”.
     
    Du deklarierst eine Variable clients, der Du eine Instanz einer Liste mit Datenobjekten zuweist.
     
    Für jeden dirHost erzeugst Du ein neues Objekt vom Typ Datenobjekt, weist der Eigenschaft “Client” den dirHost.Name zu und fügst dieses Objekt der Liste clients zu, z.B. so:
     
    private void btnListClients_Click(object sender, RoutedEventArgs e)
    {
    DirectoryEntry root = new DirectoryEntry("WinNT:");
    try
    {
    List<Data> clients = new List<Data>();
    foreach(DirectoryEntry dirEntry in root.Children)
    {
    foreach(DirectoryEntry dirHost in dirEntry.Children)
    {
    clients.Add(new Data() {Client = dirHost.Name});
    } }
    this.DataGridClients.ItemsSource = clients;
    }
    ...
     
    class Data
    {
    public string Client{get;set;}
    //...}
     
     
    --
    Peter Fleischer
    • Als Antwort vorgeschlagen Peter Fleischer Freitag, 4. Januar 2013 20:14
    • Als Antwort markiert mradic Dienstag, 8. Januar 2013 07:59
    Freitag, 4. Januar 2013 20:12
  • High Mr. Fleischer......was soll ich sagen? He he he...es funktioniert Sie haben mich vor der kompletten Verzweiflung bewahrt. Des weiteren seid Ihr einfach Klasse....super schnelle Antworten  und tolle Ideen.

    Von allein wär ich niemals drauf gekommen, in der for-schleife mit nem Objekt-Initialisierer das zu realisieren.......vielen vielen Dank.....an alle Beteiligten. (Und jetzt probier ich mal das, was mir KoopaKiller vorgeschlagen hat).

    regards: M. Radic

    Dienstag, 8. Januar 2013 07:54