2014-12-15 2 views
0

DataGridView edit에 방탄 장치를 추가하려고합니다.CancelEdit()는 원하지 않는 컨트롤을 전달합니다. 그 밖의 무엇을 할 수 있습니까?

컬럼 0, 1, 2, 3, 4는 SQL 테이블 제한뿐만 아니라 데이터 가능 기본 키를 준수하는 값을 가져야합니다.

열이 비어 있으면 데이터 테이블 기본 키에 대한 내부 예외 또는 null이 허용되지 않는 열에 대한 SQL 예외가 발생합니다.

LeaveRow 이벤트에서 어떤 열 값이 null 인 경우 CancelUpdate()을 호출합니다. 문제는 CancelUpdate()이 실행될 때 제어를 이벤트의 맨 위로 전달하고 다시 시작하는 것입니다.

  1. 올바른 동작은 CancelUpdate()입니까?
  2. 내 명시된 목표를 감안할 때, 내가 수행 할 수있는 또 다른 방법은 무엇입니까?

.

private void dgvVX130_LeaveRow(object sender, DataGridViewCellEventArgs e) 
{  
    bool z = true; // <======= CancelUpdate() passes execution to here 
    switch (dgvVX130.CurrentCell.ColumnIndex.ToString()) 
    { 
     case "0": 
      if (dgvVX130.IsCurrentRowDirty && 
       (dgvVX130.CurrentRow.Cells[1].Value.ToString() == "" || 
       dgvVX130.CurrentRow.Cells[2].Value.ToString() == "" || 
       dgvVX130.CurrentRow.Cells[3].Value.ToString() == "")) 
      { 
       z = false; 
       dgvVX130.CancelEdit(); // <=== Passes execution to top of event 
       MessageBox.Show("You must have Database, Schema, and TableName " + 
        "defined before leaving row"); // <===== Doesn't get executed 
      } 
      break; 
     case "1": 
      // Additional code is irrelevant 
      break; 
    } 
} 
+0

대신 RowValidating 또는 CellValidating 이벤트를 사용해보십시오. – LarsTech

+0

구체적으로 작성하십시오. 내가 질문을 게시하기 전에 CellValidating 시도하고 아무 데있어. 문제는 제안 된 편집을 취소하거나 사용자를 행으로 반환하여 필수 열의 값을 정의해야합니다. –

답변

1

는 LarsTech 제안을 복용 내가 탐구하고 RowValidating 이벤트를 사용했다. CancelEventArgs.Cancel 속성을 true로 설정하는 것만 큼 간단했습니다. (e.Cancel = True;)

private void dgvVX130_RowValidating(object sender, DataGridViewCellCancelEventArgs e) 
     { 
      switch (dgvVX130.CurrentCell.ColumnIndex.ToString()) 
      { 
       case "0": 
        if (dgvVX130.IsCurrentRowDirty && (dgvVX130.CurrentRow.Cells[1].Value.ToString() == "" 
         || dgvVX130.CurrentRow.Cells[2].Value.ToString() == "" 
         || dgvVX130.CurrentRow.Cells[3].Value.ToString() == "")) 
        { 
         e.Cancel = true; 
         MessageBox.Show("You must have Database, Schema, and TableName defined before leaving row"); 
        } 
        break; 
       case "1": 
        if (dgvVX130.IsCurrentRowDirty && (dgvVX130.CurrentRow.Cells[0].Value.ToString() == "" 
         || dgvVX130.CurrentRow.Cells[2].Value.ToString() == "" 
         || dgvVX130.CurrentRow.Cells[3].Value.ToString() == "")) 
        { 
         e.Cancel = true; 
         MessageBox.Show("You must have Database, Schema, and TableName defined before leaving row"); 
        } 
        break;