2013-10-30 3 views
1

DataTable을 으로 바인딩합니다. 모든 DataGridViewColumn에 대해 SortMode 속성을 Automatic으로 설정했습니다. 그러나 DataGridView에서 정렬 할 때 정렬 변경은 DataTable 인 기본 DataSource에 반영되지 않습니다. 예를 들어
:데이터 소스가 DataGridView에서 정렬을 반영하지 않음

DataTable table = new DataTable(); 
table.Columns.Add("Name"); 
table.Columns.Add("Age", typeof(int)); 
table.Rows.Add("Alex", 27); 
table.Rows.Add("Jack", 65); 
table.Rows.Add("Bill", 22); 
dataGridView1.DataSource = table; 


지금은 심지어 Alex, 27입니다 정렬 후 항상 DataTable에 0 인덱스에서 행을 반환 아래와 같이 선택한 행을 얻을 수 있다면.

DataRow newRow = table.NewRow(); 
newRow.ItemArray = table.Rows[dataGridView1.Rows.IndexOf(dataGridView1.SelectedRows[0])].ItemArray.Clone() as object[]; 

누군가이 상황에 대해 어떻게 생각하는지 제안 해주십시오.

+1

정렬 그냥 UI에서 일어나는 할 것입니다. 기본 데이터 소스를 정렬해야하는 이유는 무엇입니까? 데이터 소스는 단지 yuor 데이터 만 보유하고 있습니다. 특정 순서로 액세스하려는 경우 인덱스 또는 뷰를 사용할 수 있습니다. 최종 사용자가 결정할 재미가 없다고 결정한 것은 아닙니다. – oerkelens

+0

Gridview를 정렬 할 때 왜 정렬이 데이터 테이블에 반영되어야합니까? – tariq

+0

코드 소스에서 데이터 소스를 정렬 할 수 있습니다. – tariq

답변

4

첫 번째는 당신이 당신의 DataTable 당신의 DataGridView 영향을 미치지 않습니다 변경하는 경우 즉, 당신이 DataSource에 바인딩 경우에도 DataGridView에서 분리된다. 그리고 귀하의 경우에는 DataGridView의 정렬을 DataTable에 반영하고 싶습니다. 따라서 이러한 이유 때문에 DataGridView에서 주문/정렬의 변경 사항이있을 때마다 이벤트를 잡아야합니다. 따라서 ColumnHeaderMouseClick 이벤트는 DataGridView입니다.

또 다른 중요한 점은 DataTableDataGridView 모두의 선별 동기화를 달성에서 Sort 속성이 Datable 클래스의 DefaultView 방법이다. 따라서 우리가 할 일은 DataGridView이 정렬 될 때마다 DataTable을 정렬 할 것입니다.

먼저 DataTable 개체를 전역에 두어 나중에 어느 곳에서나 액세스 할 수 있도록해야합니다.

DataTable table; 

둘째, 우리는 ColumnHeaderMouseClick과 우리가 Form 생성자에 그것을 설정합니다 우리의 실제적인 목적을 위해 이벤트 리스너를 초기화해야합니다.

InitializeComponent(); 
dataGridView1.ColumnHeaderMouseClick += new DataGridViewCellMouseEventHandler(dataGridView1_ColumnHeaderMouseClick); 

우리는 다음이 빈 마우스 이벤트 핸들러가 :

void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) 
{    

} 

을 그리고 위의 방법이 자동으로 나오지 않는 경우에, 당신의 코드를 복사하여 붙여 넣습니다.

그리고 그림을 위해 우리는 Form Load 동안 DataTable를 추가하고이 경우에는 내가 자신의 코드를 사용하기 위하여려고하고있다 : 마지막으로 우리가 ColumnHeaderMouseClick 이벤트에 일부 코드를 넣어 다음

table = new DataTable(); 
table.Columns.Add("Name"); 
table.Columns.Add("Age", typeof(int)); 
table.Rows.Add("Alex", 27); 
table.Rows.Add("Jack", 65); 
table.Rows.Add("Bill", 22); 
dataGridView1.DataSource = table; 

과 :

void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) 
    {    
     if (dataGridView1.SortOrder.ToString() == "Descending") // Check if sorting is Descending 
     { 
      table.DefaultView.Sort = dataGridView1.SortedColumn.Name + " DESC"; // Get Sorted Column name and sort it in Descending order 
     } 
     else 
     { 
     table.DefaultView.Sort = dataGridView1.SortedColumn.Name + " ASC"; // Otherwise sort it in Ascending order 
     } 
     table = table.DefaultView.ToTable(); // The Sorted View converted to DataTable and then assigned to table object. 
    } 

는 이제 테이블 객체를 사용하고 DataGridView의 정렬 순서에 따라 정렬 할 수있다.

그냥 내 주장을 확인하기 위해, 우리는 button1라는 양식에 버튼을하고 클릭 할 때이 같은 첫 번째 행과 정렬 된 열 값이 표시됩니다 : 내가 어디 다른 대안 해결책을 발견

private void button1_Click(object sender, EventArgs e) 
    { 
    String sortedValue = dataGridView1.SortedColumn.Name == "Name" : table.Rows[0][0].ToString() ? table.Rows[0][1].ToString(); 
    MessageBox.Show(sortedValue); 
    } 
2

DataTableBindingSource 컨테이너에 넣고이 클래스를 데이터 소스 DataGridView으로 설정할 수 있습니다.

BindingSource bindingSource1 = new BindingSource(); 
bindingSource1.DataSource = dataTable; 
dataGridView1.DataSource = bindingSource1; 
// another grid view options... 

link를 참조에 대한 BindingSort를 바랍니다. 모든 DataTable 개체의

+0

그래서'DataTable'을'BindingSource'에 래핑하면'DataGridView'에서'DataTable'으로 정렬 할 수 있습니까? 'BindingSort'는 무엇입니까? – lbrahim

+1

나는 네가 말한 것처럼했다. 여전히 데이터 테이블에 대한 자동 정렬이 없습니다. – lbrahim

+0

네, 그렇지만,'DataGridView' 정렬 순서를 변경하면,'BindingSource'는이 변경을 반영합니다 ... – ghiboz

0

을 내 DataGridView에서 고유 한 열 값을 얻은 다음 DataTable 정렬되지 않은 경우에도 행을 얻으려면 기본 데이터 원본 DataTable 쿼리하십시오.
그러나 나는 DataTable을 정렬하는 방법을 알고 싶습니다. 내가 행을 삭제할 때 따라서, I.

내가 기본 데이터 중 하나 분류되지 수 있기 때문에 같은 이유로 여기에오고 다른 사람을 위해 Solution

+0

@ Md.Ibrahim 내 대답을 확인하십시오. – Edper

1

, 그것은 잘못된 삭제했다.

찾았습니다 DataTable는 정렬되지 않지만 DataTable.DefaultView 만됩니다.

그래서 대신 DataRow row = dataTable.Rows[0];

당신은 DataRow row = dataTable.DefaultView[0].Row;

관련 문제