2014-02-18 186 views
5

我在C#中製作了一個程序,它接收到sms並向用戶顯示,並且我對這些數據有問題。DataGridView自動重新排序

例如,如果用戶通過id將表格中的id從較高的id到較低的id排序,那麼當新的sms到達時它將位於表格的頂部,新的sms將反正到達表格的底部。

下面是截圖

enter image description here

正如你所看到的,編號125下的0而不是被放在桌子上......

是否有任何代碼或我應該使用的事件?

還有就是我希望啓動事件:

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

謝謝你一次Edper您的幫助!

有,當我在程序中添加消息:

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

而且AddTable方法:

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

如果你想現在還了點吧,這是一個程序在屏幕上顯示信息,例如在迪斯科舞廳,用戶從手機發送信息到由模型連接到PC的號碼,並且信息將顯示在其上,實際上我正在朋友迪斯科中測試它。

再次感謝您的幫助!

編輯:增加了一個可以幫助我修復表格的50聲望的獎勵。

回答

3

終於搞定了! 還有就是我所做的:

DataGridViewColumn column = dataGridView1.SortedColumn; 
ListSortDirection order; 

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

dataGridView1.Sort(column, order); 

所以,我得到了排序列,我在檢查,如果有什麼是爲了在DataGridView進行排序所使用分類爲同一訂單,接着我又列... 請注意,此代碼是新鮮的,因此它不是「防彈」我不檢查列和訂單的值是否爲空! 如果您需要此代碼並使用它,請記住!這幾乎就像Jayesh的回答。 謝謝大家的幫助!

0

如果您的DataGridView綁定,你可以使用:

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

如果你的DataGridView沒有綁定,你可以使用SortCompare處理程序排序值,比如:

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

那麼做到這一點:

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

我該如何激活該事件?我會用一些代碼更新我的問題,你可以看到我想要做什麼... 再次感謝您的幫助。 –

+0

如果您使用的是Winform,只需在窗體構造函數中添加事件處理函數即可。看到我更新的答案。 – Edper

+0

我做到了,但我猜想事件只發生在用戶點擊ID列(ID的選項卡)時,對吧?我需要在每次有新消息進入系統時執行該事件,否則它將在開始時進入表的底部,就像我在圖像中一樣... –

3

您可以使用datagridview的RowsAdded事件。在該方法內部,您可以編寫代碼對datagridview進行排序。

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

,但爲了使用,我需要知道用戶正在使用什麼列進行排序以及訂單是什麼... 他可能需要id,電話號碼或日期。 ..我怎麼知道它? –

0

其他的事情可能是,如果DataGrid是通過存儲過程中你捆起來可以添加一個ORDER BY但你首先要會整理數據條款等

+0

你能更具體嗎?例如,我的問題是,用戶可能想按日期,ID或電話號碼排序......甚至是消息,但我認爲他不會接受這一個......我怎麼知道他想要什麼專欄,我怎麼能把它分類? datagridview中沒有任何方法刷新用戶完成的最後一個排序? –

+0

刷新將按照被調用的方式從數據庫加載數據表。也許通過像ORDER BY ID那樣在開始時進行默認排序可能會爲您啓動 –