2014-02-18 11 views
5

Ich mache ein Programm in C#, die sms empfangen und dem Benutzer anzeigen, und ich habe ein Problem mit der Art der Daten.DataGridView automatisch neu sortieren

Zum Beispiel, wenn der Benutzer die Tabelle nach IDs sortiert, von der höheren ID zur niedrigeren, so wenn eine neue sms ankommt, wird es auf der Oberseite der Tabelle, die neue SMS wird trotzdem an den unteren Rand der Tabelle . Hier

ist ein Screenshot

enter image description here

Wie Sie sehen können, die ID 125 unter 0 ist statt auf der Spitze der Tabelle zu sein ...

Gibt es einen Code oder Ereignis, das ich verwenden sollte?

Es ist, wo ich dieses Ereignis beginnen soll:

public void readSms() 
{ 
    try 
    { 
     comm = AppData.getInstance().getComm(); 

     DecodedShortMessage[] messages = comm.ReadMessages(PhoneMessageStatus.All, "SM"); 
     foreach (DecodedShortMessage message in messages) 
     { 
      if (AppData.getInstance().mensagens.Count != 0) 
      { 
       Message msg = new Message(
        AppData.getInstance().messages.Last.Value.getId() + 1, 
        ((SmsDeliverPdu)(message.Data)).OriginatingAddress, 
        message.Data.UserDataText, 
        ((SmsDeliverPdu)(message.Data)).SCTimestamp.ToDateTime(), 
        false); 
        AppData.getInstance().setMensagem(msg); 
      } 
      else 
      { 
       Message msg = new Message(
        0, 
        ((SmsDeliverPdu(message.Data)).OriginatingAddress, 
        message.Data.UserDataText, 
        ((SmsDeliverPdu)(message.Data)).SCTimestamp.ToDateTime(), 
        false); 
       AppData.getInstance().setMensagem(msg); 
      } 
     } 

     // I need to put the event of sorting here in case any message was been added    
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
} 

Vielen Dank nochmals Edper für Ihre Hilfe!

Es ist, wenn ich die Nachricht im Programm hinzufügen:

public void preencherTabela(int lastIndex) 
{ 
    LinkedList<Message> messages = AppData.getInstance().getMessagessList(); 
    { 
     addTable(
      messages.ElementAt(i).getId(), 
      messages.ElementAt(i).getChecked(), 
      messages.ElementAt(i).getMsg(), 
      messages.ElementAt(i).getNum(), 
      messages.ElementAt(i).getDate()); 
    } 
} 

Und die AddTable Methode:

private void addTable(int p, bool p_2, string p_3, string p_4, DateTime dateTime) 
{ 
    this.dataGridView1.Invoke(
     new MethodInvoker(() => 
     { 
      this.dataGridView1.Rows.Add(p, p_2, p_3, p_4, dateTime); 
     })); 
} 

Wenn Sie auch der Punkt, der es jetzt wollen, ist dies ein Programm für Zeigen Nachrichten auf einem Bildschirm, zum Beispiel in einer Disko, senden die Benutzer Nachrichten vom Handy an eine Nummer, die durch ein Modell mit einem PC verbunden ist, und die Nachrichten werden darauf angezeigt, tatsächlich teste ich es in einer Freundesdisco.

Nochmals vielen Dank für die Hilfe!

Edit: Hinzugefügt ein Kopfgeld von 50 Ruf für wer kann mir helfen, den Tisch zu reparieren.

Antwort

3

Endlich hat es funktioniert! Es ist das, was ich getan habe:

DataGridViewColumn column = dataGridView1.SortedColumn; 
ListSortDirection order; 

if (dataGridView1.SortOrder.Equals(SortOrder.Ascending)) 
    { 
     order = ListSortDirection.Ascending; 
    } 
else 
    { 
     order = ListSortDirection.Descending; 
    } 

dataGridView1.Sort(column, order); 

So bekam ich die sortierte Spalte und überprüfe ich in ein, wenn, was ist die Reihenfolge, in der Datagridview sortiert ist, dann ich irgendwie wieder die Spalte, die für die gleiche Reihenfolge sortiert Gebraucht ... Beachten Sie, dass dieser Code frisch ist, so dass es nicht "kugelsicher" ist. Ich überprüfe nicht, ob die Werte der Spalte und der Reihenfolge null sind oder nicht! Wenn Sie diesen Code benötigen und ihn verwenden, denken Sie daran! Es ist fast wie die Antwort von Jayesh. Vielen Dank für die Hilfe!

0

Wenn Ihr Datagridview gebunden ist, könnten Sie verwenden:

public Form1() 
    { 
     InitializeComponent(); 
     dataGridView1.SortCompare += new DataGridViewSortCompareEventHandler(dataGridView1_SortCompare); 
    } 

dies dann tun:

dataGridView1.Columns[0].ValueType = typeof(System.Int32); 
dataGridView1.Columns[0].CellTemplate.ValueType = typeof(System.Int32); 

Wenn Ihr Datagridview nicht gebunden ist, Sie SortCompare Handler in Sortier Werte, wie zu verwenden:

void dataGridView1_SortCompare(object sender, DataGridViewSortCompareEventArgs e) 
    { 
     if (e.Column.Index == 0) 
     { 
      if (int.Parse(e.CellValue1.ToString()) > int.Parse(e.CellValue2.ToString())) 
      { 
       e.SortResult = 1; 
      } 
      else if (int.Parse(e.CellValue1.ToString()) < int.Parse(e.CellValue2.ToString())) 
      { 
       e.SortResult = -1; 
      } 
      else 
      { 
       e.SortResult = 0; 
      } 
      e.Handled = true; 
     } 
    } 
+0

Und wie kann ich dieses Ereignis aktivieren? Ich werde meine Frage mit etwas Code aktualisieren, damit Sie sehen können, was ich versuche zu tun ... Und noch einmal, danke für Ihre Hilfe. –

+0

Wenn Sie Winform verwenden, fügen Sie einfach den Ereignishandler in Ihrem Formularkonstruktor hinzu. Siehe meine aktualisierte Antwort. – Edper

+0

Ich habe es getan, aber ich denke, dass das Ereignis nur auftritt, wenn der Benutzer auf die ID-Spalte (die Registerkarte der IDs) klicken, richtig? Ich brauche, dass das Ereignis jedes Mal ausgeführt wird, dass eine neue Nachricht in das System kommt, sonst wird es in der Unterseite der Tabelle in Schritt be am Anfang sein, wie ich in dem Bild habe ... –

3

Sie können das RowsAdded-Ereignis von datagridview verwenden. Innerhalb dieser Methode können Sie Code schreiben, um die Datagridview zu sortieren.

private void dataGridView1_RowsAdded(object sender, 
     DataGridViewRowsAddedEventArgs e) 
{ 
    datagridview1.Sort(); 
} 
+0

aber für den Einsatz muss ich wissen, welche Spalte der Benutzer verwendet, um zu sortieren, und was ist die Reihenfolge ... Er möchte die ID eins, oder Telefonnummern oder Datum. .. wie kann ich es wissen? –

0

Das könnte andere Sache, dass, wenn das Datenraster von einer gespeicherten Prozedur innerhalb dieser gebunden ist Sie eine ORDER BY-Klausel hinzufügen könnte, die die Daten sortiert werden würde, aber Sie in erster Linie wollen ...

+0

Können Sie genauer sein? Zum Beispiel ist mein Problem, dass Benutzer vielleicht nach Datum, ID oder Telefonnummer ... oder sogar Nachrichten bestellen möchten, aber ich denke, er wird das nicht nehmen ... wie kann ich wissen, welche Spalte er will und wie kann ich ordne es? Es gibt keine Methode in Datagridview, die die letzte vom Benutzer vorgenommene Sortierung aktualisiert? –

+0

Die Aktualisierung würde die Datentabelle von der Datenbank in der Weise laden, wie sie aufgerufen wurde. Vielleicht, wenn Sie am Anfang eine Standardsortierung wie ORDER BY ID haben, würde dies für Sie initiiert werden –

Verwandte Themen