2014-02-18 6 views
5

저는 C#에서 sms을 받고 사용자에게 표시되는 프로그램을 만들고 있는데 데이터 정렬에 문제가 있습니다.DataGridView 자동 다시 정렬

예를 들어 사용자가 ID를 기준으로 테이블을 정렬하는 경우 상위 ID에서 하위 ID로 새로운 sms이 도착하면 테이블 상단에 새로운 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 가지의 명성을 추가했습니다. 당신의 DataGridView에 바인드되어있는 경우

답변

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에이 정렬 순서 어떤 경우 ... 이 코드는 신선하므로 "방탄"이 아닙니다. 열 값과 순서 값이 null인지 아닌지 확인하지 않습니다! 이 코드가 필요하다면이를 염두에 두십시오! 거의 Jayesh의 답변과 같습니다. 도움을 주셔서 감사합니다.

0

, 당신은 사용할 수 있습니다 : 그런 다음 이렇게

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

: 당신의 DataGridView에 바인드되어 있지 않으면

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

, 당신은 같은 정렬 값을 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을 사용하는 경우 Form 생성자에 이벤트 처리기를 추가하기 만하면됩니다. 내 업데이트 답변을 참조하십시오. – Edper

+0

나는 그것을했는데, 사용자가 ID 열 (ID 탭)을 클릭했을 때만 발생하는 것 같아요. 맞습니까? 새로운 메시지가 시스템에 도착할 때마다 이벤트가 실행되도록해야합니다. 이미지에있는 것처럼 처음부터 단계적으로 테이블 하단에 나타납니다. –

3

DataGridview의 RowsAdded 이벤트를 사용할 수 있습니다. 이 메서드 내에서 코드를 작성하여 DataGridview를 정렬 할 수 있습니다.

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

도움을 주셔서 감사합니다.하지만 사용자가 어떤 열을 정렬하고 어떤 순서로 사용했는지 알아야합니다. 그는 ID 하나 또는 전화 번호 나 날짜를 원할 수 있습니다. .. 어떻게 알 수 있니? –

0

다른 점은 데이터 그리드가 그 안에 저장 프로 시저에 의해 구속되는 경우 ... 첫 번째 장소에서 원하는 그러나 데이터를 정렬 할 ORDER BY 절을 추가 할 수있을 수

+0

당신은 더 구체적 일 수 있습니까? 예를 들어, 내 문제는 사용자가 날짜, ID 또는 전화 번호 또는 메시지로 주문하고 싶어 할 수 있다는 것입니다.하지만 그는이 태그를 가져 가지 않을 것이라고 생각합니다. 어떻게하면 원하는 열을 알 수 있으며 어떻게해야합니까? 정렬 해? 사용자가 수행 한 마지막 정렬을 새로 고치는 DataGridview의 메소드가 없습니까? –

+0

새로 고침은 데이터베이스에서 데이터 테이블을 호출하는 방식으로로드합니다. 어쩌면 ORDER BY ID와 같이 처음에 기본 정렬을 사용하여 시작했을 수 있습니다. –