2012-08-22 4 views
0

데이터 격자보기를 사용하여 1000 개의 행과 800 개의 데이터 열 (한 셀당 하나의 문자)을 표시합니다. 체크 박스 열도 있습니다. "선택한 셀보기"와 같은 컨텍스트 메뉴 항목을 추가했습니다. 그 중 하나를 클릭하면 Checked Rows 만 표시하려고합니다. 그 이전에 나는 체크 된 행의 Visible 속성을 False으로 설정하고 각각을 반복했다. 이것은 많은 시간을 소비하고 있습니다.DataView RowFilter가 올바른 결과를 제공하지 않습니다.

그래서 을 적용하여 DataView 제어를 사용해 보았습니다. 좀 더 빠르게 보이지만. 그러나 검사 된 행 중 일부는 표시되지 않습니다.

내가 10 개의 행을 가지고 있다면, 그 중 5 개의 행이 검사됩니다. 그런 다음 4 행만 표시됩니다. 실제로 그것은 검사되는 5 개의 행을 보여줘야합니다.

는 내가 같은 문제가 무엇입니까 이런 것들을 모두 이러한 것들을 dView.RowFilter="CheckBoxCol=true";

  • dView.RowFilter="CheckBoxCol";
    1. 을 시도했다. 아무도 이것에 나를 도울 수 있습니까?

  • +1

    에 (예 : 데이터 테이블, 오브젝트의 목록으로) 당신의 dataviewcontrol에 대한 기본 바인딩 데이터 소스가 아니면 수동으로 데이터 그리드를 채우기있다 ? –

    +0

    표시되는 옵션이 모두 잘 작동해야합니다.이 문제가 발생할 수 있다고 생각하는 유일한 이유에 따라 답변을 제공했습니다. 제 추측이 잘못 되었다면이 문제를 재현하는 방법에 대한 자세한 정보를 제공해주십시오. 최소한의 해결책이면에있는 코드가 가장 좋습니다. –

    답변

    0

    표시 한 두 가지 방법 모두 부울 열에 RowFilter으로 작동합니다.

    DataGridView이 편집을 처리하는 방법으로 문제가 발생할 가능성이 높습니다. 현재 편집 셀에 포커스가 없거나 컨텍스트 메뉴를 표시하는 가장 일반적인 방법이있을 때까지 기본 데이터 소스에 커밋되지 않습니다. 그리드에서 셀이 포커스를 잃지 않습니다.

    void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e) 
    { 
        if (e.Button == MouseButtons.Right) 
        {    
         contextMenuStrip1.Show(dataGridView1, e.Location); 
        } 
    } 
    

    그런 다음 변경 한 가장 최근의 체크 박스는 데이터보기에 그것의 변화를 플러시하지 않습니다 : 당신이 당신의 상황에 맞는 메뉴는 다음과 같이 일을 보여 주면

    , 즉.

    이 솔루션은 두 부분으로 나뉩니다. 먼저 데이터보기와 DataGrid 사이에있는 바인딩 소스를 도입해야합니다.

    bindingSource1.DataSource = dView; 
    dataGridView1.DataSource = bindingSource1; 
    

    는 그런 다음 데이터 그리드 뷰에 'CurrentCellDirtyStateChanged'처리기에 다음 코드를 추가해야합니다

    void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e) 
    { 
        if (dataGridView1.IsCurrentCellDirty) 
        { 
         dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit); 
        } 
    } 
    

    마지막으로 필터를 적용 코드 내에도 EndEdit를 호출해야 내 이전 경험에서

    private void filterToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
        bs.EndEdit(); 
        dvSections.RowFilter = "CheckBoxCol"; 
    } 
    

    일 : 바인딩 소스에 전자 바인딩 소스가 필요하지는 않지만 컨텍스트 메뉴와 데이터보기가 꽤 혼합 된 상태에서 시도하지 않았습니다. 시도했을 때 bs.EndEdit()이 필요하다는 것을 알았습니다. 데이터 그리드보기의 기본 소스 테이블의 경우에

    해보십시오 Table.AcceptChanges을 -

    0

    나는 (내가 여기서 뭘하려는 것 인 미안 난 단지 의견을 충분히 포인트가없는) 데이비드 홀이 올바른지 생각 가능한.

    이 표에 대한 느린 변경 사항을 적용해야하며, 이후 DGV