2009-10-06 3 views
1

개체의 BindingList에 바인딩 된 DataGrid 컨트롤이 있습니다. 객체 클래스의 속성 중 하나는 부울입니다. 나는 datagridview에서 해당 열을 체크 박스 유형으로 사용자 정의했습니다.체크 박스 열이있는 DataGrid보기에서 FormatException이 수정 됨

바인딩 목록에서 가져온 값이있는 행에 대해 datagridview가로드되면 문제가 해결됩니다. 그러나 "새 항목"줄을 그릴 때 확인란 셀에 System.FormatException이 throw됩니다.

정확한 오류 메시지 (관련 부분)

다음과 같은 예외가있는 DataGridView에서 발생

System.FormatException: Value '' cannot be converted to type 'Boolean'. at System.Windows.Forms.Formatter.FormatObjects.... 

내이 발생할 수 있음을 나타내는 검색 할 때 체크 박스의 참 거짓 및 불확정 값 열이 설정되지 않았습니다. 내 비슷한 문제를 참조하는
URL은 :

http://social.msdn.microsoft.com/Forums/en-US/winformsdatacontrols/thread/c29427ff-18be-4fb0-a0a7-d1940e1cd817

는 그러나, 나는 (아래 코드와 같이)이 값을 설정했습니다. 이 외에도 내 문제와 관련된 다른 정보를 찾을 수 없습니다. 나는 문제가 체크 박스의 사용에 국한되어 있다는 것을 확신한다. 왜냐하면 칼럼 타입을 간단한 텍스트 박스로 바꿀 때, 나는 예외 에러를 얻지 않는다. 단순히 "새로운 엔트리"라인이 표시된 true/false 컬럼이다. 가치 없음.

된 DataGridView 코드 :

// 
     // dataGridView1 
     // 
     this.dataGridView1.AllowUserToResizeRows = false; 
     dataGridViewCellStyle1.BackColor = System.Drawing.SystemColors.Control; 
     dataGridViewCellStyle1.ForeColor = System.Drawing.SystemColors.WindowText; 
     dataGridViewCellStyle1.NullValue = null; 
     dataGridViewCellStyle1.SelectionBackColor = System.Drawing.SystemColors.Highlight; 
     dataGridViewCellStyle1.SelectionForeColor = System.Drawing.SystemColors.HighlightText; 
     this.dataGridView1.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle1; 
     this.dataGridView1.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill; 
     this.dataGridView1.AutoSizeRowsMode = System.Windows.Forms.DataGridViewAutoSizeRowsMode.DisplayedCells; 
     this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; 
     this.dataGridView1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { 
     this.columnDescription, 
     this.columnExpedite, 
     this.columnId, 
     this.columnQuantity, 
     this.columnEntryDate, 
     this.columnUpdateDate}); 
     this.dataGridView1.Location = new System.Drawing.Point(3, 5); 
     this.dataGridView1.Name = "dataGridView1"; 
     this.dataGridView1.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; 
     this.dataGridView1.Size = new System.Drawing.Size(1015, 241); 
     this.dataGridView1.TabIndex = 0; 
     // 
     // columnDescription 
     // 
     this.columnDescription.DataPropertyName = "Description"; 
     this.columnDescription.FillWeight = 200F; 
     this.columnDescription.HeaderText = "Description"; 
     this.columnDescription.Name = "columnDescription"; 
     // 
     // columnExpedite 
     // 
     this.columnExpedite.DataPropertyName = "Expedite"; 
     this.columnExpedite.FalseValue = "false"; 
     this.columnExpedite.HeaderText = "Expedited"; 
     this.columnExpedite.Name = "columnExpedite"; 
     this.columnExpedite.Resizable = System.Windows.Forms.DataGridViewTriState.True; 
     this.columnExpedite.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic; 
     this.columnExpedite.TrueValue = "true"; 
     this.columnExpedite.IndeterminateValue = "false"; 
     // 
     // columnId 
     // 
     this.columnId.DataPropertyName = "Id"; 
     this.columnId.HeaderText = "Id"; 
     this.columnId.Name = "columnId"; 
     this.columnId.Visible = false; 
     // 
     // columnQuantity 
     // 
     this.columnQuantity.DataPropertyName = "Quantity"; 
     this.columnQuantity.HeaderText = "Quantity"; 
     this.columnQuantity.Name = "columnQuantity"; 
     // 
     // columnEntryDate 
     // 
     this.columnEntryDate.DataPropertyName = "EntryDateTime"; 
     dataGridViewCellStyle2.Format = "g"; 
     dataGridViewCellStyle2.NullValue = null; 
     this.columnEntryDate.DefaultCellStyle = dataGridViewCellStyle2; 
     this.columnEntryDate.HeaderText = "Entry Date/Time"; 
     this.columnEntryDate.Name = "columnEntryDate"; 
     this.columnEntryDate.ReadOnly = true; 
     this.columnEntryDate.Resizable = System.Windows.Forms.DataGridViewTriState.True; 
     this.columnEntryDate.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; 
     // 
     // columnUpdateDate 
     // 
     this.columnUpdateDate.DataPropertyName = "UpdateDateTime"; 
     this.columnUpdateDate.HeaderText = "Last Update Date/Time"; 
     this.columnUpdateDate.Name = "columnUpdateDate"; 
     this.columnUpdateDate.ReadOnly = true; 
     this.columnUpdateDate.Resizable = System.Windows.Forms.DataGridViewTriState.True; 
     this.columnUpdateDate.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; 

편집 추가 : 내가 해봤 몇 가지 추가하십시오 DefaultValueNeeded 이벤트를 사용하여 시도

  • . 디폴트 값은 새로운 엔트리 라인을 "만지면"로드되지만 그 전에는 "새로운 엔트리"라인이 실제로 페인팅 될 때 예외가 발생합니다.

  • dataGridView1.Columns [ "columnExpedite"]를 사용하려고 시도했습니다. DefaultCellStyle.NullValue = "false"; 같은 결과가 나타납니다.

이 예외는 어떻게 해결합니까?

답변

1

이 내용을 잘못 읽었을 수 있지만 이는 운영 명령 문제와 같습니다. 그 항목에 목록을 추가하는 코드가 보이지 않아서 그의 코드가 100 % 확실하지는 않지만 목록에 새 객체를 추가 한 다음 값을 수정하는 것 같습니다.

부울 값이 null이 아닌지 확인해야합니다. 새 항목을 추가하는 경우. 당신은 전에 전에 그것을 추가하는 객체의 값을 채울 필요가 있습니다. 이것을 보장하는 한 가지 가능한 방법은 기본값을 false 또는 true로 설정하거나 생성자에서이 값을 설정하는 것입니다.

편집 -

내가이 나 자신을 테스트하지 않았 추가,하지만 난 당신을 위해 작동합니다 바라고 있어요.

당신이 DataGridView에의 DefaultValuesNeeded 이벤트에 연결할 수 있습니다? 예외가 발생하기 전에 그 이벤트는

+0

이것은 좋은 지적입니다. 나는 그것을 처리 했어야하는데, 나의 bind 문은 폼로드에서 발생한다. 또한 내 생성자는 실제로 부울 멤버에 대한 기본값을 설정합니다. "새 항목"행을 클릭하면 기본값이 가져옵니다 (기본 날짜도 설정 됨). "새 항목"줄을 화면에 그릴 때 문제가 발생합니다. – Allen

+0

는 그 이벤트를 시도하고, 값을 설정 ... 그리고 그것을 채울 않지만, 내가 새 항목 ... 예외 화재가 새 항목 라인 페인트를 클릭하지 때까지. 문자 그대로 그 셀에서 멈 춥니 다. – Allen

1

예 ... 문제를 해결해야하는, 발사한다. 다음 코드를 시도하십시오 :

private void dataGridViewEpizode_DefaultValuesNeeded(object sender, DataGridViewRowEventArgs e) 
    { 
     try 
     { 
      e.Row.Cells[22].Value = false; 
     } 
     catch (Exception ex) 
     { 
      mainForm.staticvar.logger.Write(ex); 
     } 
    }