2010-05-11 7 views
1

단순화합니다. ,DataGridViews, DataBinding 및 유효성을 검사하지 않는 셀 값

class Foo 
{ 
    public string Name { get; set; } 
    public int Age { get; set; } 
    public int height{ get; set; } 
    ... 
} 

나는 N 개의 열이있는 BindingList<Foo>에 결합 DataGridView.DataSource가 각 속성에 바인딩 하나 하나 :이 클래스가 있다고 할 수 있습니다.

내가 수행해야합니다

  • 사용자가 아닌 검증 나이, 높이를 입력 할 수 있도록 허용 등 (예 : "AAA"에 대한)
  • 색이 아닌 검증 값으로 세포 (빨간색 배경)
  • 양식이 닫힐 때까지 표시되는 유효성이 검증되지 않은 값을 유지합니다 (양식을 닫을 때까지 입력 한 값을 잃어 버리지 않으므로 양식을 닫기 전에 원하는 불량 셀을 수정할 수있는 옵션이 표시됩니다)
  • 각 셀에 대해 마지막으로 올바른 값을 입력 한 상태로 유지하십시오. 입력 된 값의 유효성을 검사합니다.
  • 양식을 닫으면 유효하지 않은 값을 버리고 최종 값을 정확하게 입력하십시오.

쉬운 방법이 있습니까?

+0

질문 부분에 "유효하지 않은 값을 입력하고 마지막으로 올바른 값을 입력하십시오." 누군가 이름을 변경 한 다음 나이를 변경하면 이름 변경을 저장 하시겠습니까? –

+0

아니요. DB를 일관성있게 유지하기 위해 올바른 정보 만 유지하려고합니다. –

답변

2

어제 날짜 열과 동일한 문제가 있습니다.

CellFormatting 및 CellParsing 이벤트를 발견했지만 BindingSource가이를 무시한 것 같습니다. 그래서 나는 이것을 좋아했다. 나는 세포를 사용했다. Tag 속성. 여기서 dgv는 DataGridView입니다.

private void dgv_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) 
    { 
     if (IsBirthdayColumn(e.ColumnIndex)) 
     { 
      e.Value = dgv[e.ColumnIndex, e.RowIndex].Tag; 
      if (e.Value is DateTime) 
      { 
       e.Value = ((DateTime)e.Value).ToShortDateString(); 
      } 
      e.FormattingApplied = true; 
     } 
    } 

    private void dgv_CellParsing(object sender, DataGridViewCellParsingEventArgs e) 
    { 
     DateTime date; 
     if (IsBirthdayColumn(e.ColumnIndex)) 
     { 
      if (e.Value != null && DateTime.TryParse(e.Value.ToString(), out date)) 
      { 
       e.Value = date; 
       dgv[e.ColumnIndex, e.RowIndex].Tag = e.Value; 
      } 
      else 
      { 
       dgv[e.ColumnIndex, e.RowIndex].Tag = e.Value; 
       e.Value = DBNull.Value; 
      } 
      e.ParsingApplied = true; 
     } 
    } 

    private void dgv_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) 
    { 
     DateTime date; 
     if (IsBirthdayColumn(e.ColumnIndex)) 
     { 
      var cell = dgv[e.ColumnIndex, e.RowIndex]; 
      if (e.FormattedValue != null && !DateTime.TryParse(e.FormattedValue.ToString(), out date)) 
      { 
       if (e.FormattedValue.ToString().Trim().Equals("")) 
       { 
        cell.ErrorText = string.Empty; 
        return; 
       } 
       cell.ErrorText = "Invalid date format"; 
      } 
      else 
      { 
       cell.ErrorText = string.Empty; 
      } 
     } 
    } 

또한 유

private void dgv_DataError(object sender, DataGridViewDataErrorEventArgs e) 
    { 
     ...... 
     e.Cancel = false; 
     ...... 
    } 

지금 u는 날짜 열에서 아무것도 쓸 수 DataError 이벤트를 처리 할 필요가있다. 유효하지 않은 날짜의 경우에는 u 오류 아이콘을 표시하고 DBNull을 DataSet에 저장합니다. 빈 문자열의 경우 DBNull 만 저장합니다.

1

모두 대답 할 수는 없지만 빨간색 배경을 사용할 수 있습니다.

처음에해야 할 일은 DataGridView.CellValidating입니다. 이벤트 중에 e.Cancel을 true로 설정하십시오.

기본 동작 인 빨간색 느낌표 대신 전체 빨간색 배경을 사용하려는 경우 DataGridTextBox의 상속 된 클래스를 만들고 DataGridViewCell.PaintErrorIcon을 재정의해야합니다. 그러면 셀을 빨간색 대신 빨간색으로 그릴 수 있습니다. 빨간색 느낌표.

관련 문제