2016-08-04 16 views
1

Ich habe ein Programm in C# codiert, die UDP-Pakete aus verschiedenen Quellen mit mehreren IP-Adresse empfängt.Anzeige DataTable in einer einfachen GUI C#

Ich habe eine Datentabelle erstellt, die alle IP-Adressen und Informationen speichert, die mit den Quellen verknüpft sind, und ich versuche, diese Tabelle im Programm anzuzeigen, wenn ich sie ausführe.

Da das Programm ständig UDP-Pakete abhört, sollte die Anzeige der Tabelle in Echtzeit aktualisiert werden.

Ich habe nach Datagridview gesucht, aber ich habe es nicht erfolgreich, es zu verwenden.

Ich möchte auf dem Bildschirm auf eine sehr einfache Art und Weise, so etwas zeigen: Data Viewing

static void Main(string[] args) 
     { 
      DataTable CommunicationTable = new DataTable(); 
      initDataTableCommunication(CommunicationTable); 

      senderIdentifier SmartphoneTest = new senderIdentifier(); 
      SmartphoneTest.addressIP = "192.120.120.0"; 
      SmartphoneTest.message = "Started"; 
      SmartphoneTest.port = 11000; 

      newEntryDateTableCom(SmartphoneTest, CommunicationTable); 

      senderIdentifier SmartphoneTest2 = new senderIdentifier(); 
      SmartphoneTest2.addressIP = "192.120.45.9"; 
      SmartphoneTest2.message = "Done"; 
      SmartphoneTest2.port = 11000; 

      newEntryDateTableCom(SmartphoneTest2, CommunicationTable); 

Hier erfüllt I „von Hand“ die Datatable, aber die neuen Einträge werden durch den Empfang der UDP-Pakete erstellt werden

im Moment kann ich nur die Datentabelle mit dem Debug sichtbar zu machen, den „scope“ auf der Uhr des Datatable (Visual Studio)

Sorry für mein schlechtes Englisch und dank im Voraus mit

+0

Sprichst du wirklich über die Daten in einem Konsolenfenster zeigt oder haben Sie eine Benutzeroberfläche wie Windows Forms und wollen wissen, wie man mit einem Datagridview zu arbeiten? Zum einen bietet die Klasse ['Console'] (https://msdn.microsoft.com/en-us/library/system.console (v = vs.110) .aspx) eine Vielzahl von Methoden, um Cursorpositionen zu setzen und Farben, so dass Sie in der Lage sein sollten, eine Tabelle "zu zeichnen" und zu aktualisieren. Die zweite Version ist etwas zu weit gefasst, aber es gibt viele Artikel, Anleitungen und Tutorials im Internet. –

+0

Ja, ich würde lieber eine Benutzeroberfläche für Windows erstellen, anstatt die gleiche Tabelle immer wieder in der Konsole zu drucken. Ich bin daran interessiert, mit einem Datagridview und einem Formular zu arbeiten, wenn es mit nicht zu viel Code möglich ist. – Pbmke

+0

Was haben Sie der Eigenschaft 'DataSource' Ihres' DataGridview' zugewiesen? War es eine "DataTable" -Instanz oder eine generische Sammlung? –

Antwort

0

Sie müssen ein neues Windows Forms-Projekt erstellen und ein DataGridView Steuerelement darauf löschen. Definieren Sie Ihre CommunicationTable als ein Feld Ihrer neu erstellten Form und setzen Sie Ihre CommunicationTable Initialisierung irgendwo in den Initialisierungscode (der Konstruktor des Formulars ist ein guter Kandidat). Diese Initialisierung sollte auch die DataSource Eigenschaft von DataGridview auf CommunicationTable setzen.

Dann führen Sie Ihre UDP-Hörroutine in einem separaten Thread und aktualisieren Sie die CommunicationTable. Vergessen Sie jedoch nicht, Form.Invoke() zu verwenden, um Daten im GUI-Thread zu aktualisieren. Hier

ist ein vereinfachtes Beispiel:

DataTable CommunicationTable = new DataTable(); 
Thread listeningThread; 
public Form1() 
{ 
    InitializeComponent(); 
    CommunicationTable.Columns.Add("addressIP", typeof(string)); 
    CommunicationTable.Columns.Add("port", typeof(int)); 
    CommunicationTable.Rows.Add("127.0.0.1", 1100); 

    // Notice this assignment: 
    dataGridView1.DataSource = CommunicationTable; 

    listeningThread = new Thread(() => { 
     // UDP listener emulator. 
     // Replace with actual code but don't forget the Invoke() 
     for (int i = 0; i < 10; i++) 
     { 
      Invoke((MethodInvoker)delegate { 
       CommunicationTable.Rows.Add("127.0.0.1", 1024 + i); }); 
      Thread.Sleep(300); 
     } 
    }); 
    listeningThread.Start(); 
} 
+0

Vielen Dank, ich werde diese Lösung versuchen, dann als Antwort markieren, wenn es funktioniert – Pbmke

+0

Ich stimme Ihrer Lösung zu, aber ich hätte lieber verwendet ** ThreadPool.QueueUserWorkItem ** Oder ein ** BackgroundWorker ** :) –

+0

@SofteEng, guter Punkt. Ja, das 'ThreadPool.QueueUserWorkItem' ist eine Option. Doch in diesem speziellen Fall stimme ich eher http://stackoverflow.com/a/6193066/4295017 zu, denn wir haben einen _ "persistenten, dedizierten, lang laufenden Thread" _. Wie auch immer, beide Optionen sind in unserem Fall in Ordnung und es ist eher eine Frage des Programmgeschmacks, welchen man wählen sollte. –