2014-02-18 185 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那样在开始时进行默认排序可能会为您启动 –