DataGridView自动重新排序

时间:2014-02-18 22:53:46

标签: c# sorting datagridview

我正在C#中创建一个接收sms并显示给用户的程序,我遇到了这类数据的问题。

例如,如果用户按ids对表进行排序,则从较高的id到较低的ID,以便当新的sms到达时它会位于表的顶部,新的短信将到达底部无论如何,这张桌子。

这是截图

enter image description here

正如您所看到的,ID 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点声望的赏金。

4 个答案:

答案 0 :(得分:3)

您可以使用datagridview的RowsAdded事件。在该方法中,您可以编写代码来对datagridview进行排序。

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

答案 1 :(得分:3)

终于搞定了! 我做了什么:

DataGridViewColumn column = dataGridView1.SortedColumn;
ListSortDirection order;

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

dataGridView1.Sort(column, order);

所以,我得到了排序列,然后我检查了一个if datadridview排序的顺序是什么,然后我再次排序使用为相同顺序排序的列... 请注意,此代码是新鲜的,因此它不是“防弹”我不检查列和顺序的值是否为空! 如果您需要此代码并使用它,请记住这一点! 这几乎就像Jayesh的答案。 谢谢大家的帮助!

答案 2 :(得分: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;
        }
    }   

答案 3 :(得分:0)

另一件事可能是,如果数据网格被一个存储过程绑定,你可以添加一个ORDER BY子句,它会根据你想要的数据排序......