2016-11-08 7 views
1

제발 좀 쉬워주세요. 저는 C#과 그 무언가로 전적으로 자기 가르치기 때문에 여유 시간에 놀 수있는 기회를 얻습니다!dataview rowfilter가 예상대로 작동하지 않습니다.

부울 유형의 한 열을 포함하는 데이터 테이블을 보유하고 있습니다. 이 테이블을 DataGridview에 바인딩하고 부울 유형을 사용하여 빈 체크 박스 열을 표시 한 다음 사용자는 여러 행 옆의 상자를 선택할 수 있습니다.

DataGrid를 충전 :

public void fillDatagridView() 
{ 
    dtMembers.Columns.Add("Print", typeof(bool)); 
    dtMembers.Columns.Add("Contact ID", typeof(string)); 
    dtMembers.Columns.Add("Membership Number", typeof(int)); 
    dtMembers.Columns.Add("First Name", typeof(string)); 
    dtMembers.Columns.Add("Last Name", typeof(string)); 
    dtMembers.Columns.Add("Current Application Type", typeof(string)); 
    dtMembers.Columns.Add("Email Address", typeof(string)); 
    dtMembers.Columns.Add("Membership Type", typeof(string)); 
    dtMembers.Columns.Add("Approval Date", typeof(DateTime)); 

    dgMembers.DataSource = dtMembers; 
} 

은 "나는 또한이 옵션을 선택하면 행을 확인 만 표시에있는 DataGridView를 필터링 양식에 확인란을"쇼 행을 선택 "이 코드는 다음과 같습니다 쇼가이 시점에 "그래서 모든 좋은 행을 확인 : 행을 확인"는 사용자가 다음 여러 행과 검사를 틱 때

private void cbShowSelected_CheckedChanged(object sender, EventArgs e) 
{ 
    if (cbShowSelected.Checked) 
     dtMembers.DefaultView.RowFilter = "Print = True"; 
    else 
     dtMembers.DefaultView.RowFilter = string.Empty; 
} 

위의 코드가 잘 작동 이벤트를 확인하십시오. " 많은 수의 행을 검사해야하는 사용자가 몇 명 있습니다. 유용성을 고려하여 검색 텍스트 상자에 멤버십 번호를 입력하면 datagridview가 해당 멤버십 번호로 필터링되도록 코드를 추가했습니다. 또한 사용자가 + 심볼을 입력하고 필터보기에 하나의 행만있는 경우 해당 행을 틱합니다. 그 코드가 성공적으로 해당 행의 체크 박스에 체크 않지만, 그때 가서 확인하면

private void textBox1_TextChanged(object sender, EventArgs e) 
{ 
    if (textBox1.Text.Length > 0) 
    { 
     if (textBox1.Text.Substring(textBox1.Text.Length - 1) != "+") 
     { 
      dtMembers.DefaultView.RowFilter = string.Format("[_RowString] LIKE '%{0}%'", textBox1.Text); 
     } 
     else 
     { 
      if (dgMembers.DisplayedRowCount(false) == 1) 
      { 
       dgMembers.Rows[dgMembers.FirstDisplayedCell.RowIndex].Cells[0].Value = true; 
       textBox1.Text = string.Empty; 
      } 
     } 
    } 
} 

해당 행이 결과 필터링 된보기에 포함되지 않는다 "쇼 행을 검사"나는 다음과 같은 코드를 사용하여 해당했다. 수동으로 두 행을 확인한 다음 + 기호를 사용하여 하나를 선택하면 수동으로 확인하는 모든 행이 표시되지만 + 기호를 사용하는 행은 표시되지 않습니다. bool이 해당 행에 대해 True로 설정되어 있는지 확인하기 위해 코드를 디버깅했습니다. 이제는 문제가 있습니다! 어떤 도움이라도 정말 감사 할 것입니다.

+0

OK, 테스트를 더 해보고 명확하게해야합니다. + 기호를 사용하여 행을 체크 한 다음 "선택한 레코드 표시"를 선택하면 레코드가 표시되지 않습니다. 수동으로 다른 레코드를 수동으로 틱한 다음 "선택한 레코드 표시"를 선택하면 두 레코드가 모두 표시됩니다. –

+0

아마도 "== true"를 추가해야 체크 할 수 있습니까? – starko

+0

의견을 보내 주셔서 감사합니다. 시도해 봤지만 도움이되지 않습니다. 수동으로 셀을 검사 할 때 정확히 동일한 필터 구문이 작동하지 않는다고 생각했습니다. 일을 간단하게하기 위해 이제 datagridview, 텍스트 상자 (검색) 및 체크 상자 (체크 된 행 표시)가있는 새로운 프로젝트를 만들었고 코드를 기본으로 다시 제거했습니다. 불행히도 저는 여전히 같은 문제가 있습니다. –

답변

0

나는 결국이 문제를 해결할 수있었습니다. 문제는 DataGridView가 바인딩 된 DataTable의 값보다는 DataGridView 값을 설정한다는 것입니다. 이제는 작동하는 다음 코드를 사용하고 있습니다.

BindingManagerBase bm=this.dgMembers.BindingContext[this.dgMembers.DataSource, this.dgMembers.DataMember]; 
DataRow dr = ((DataRowView)bm.Current).Row; 
dr["print"] = true