1

オブジェクトのBindingListにバインドされたデータグリッドコントロールがあります。オブジェクトクラスのプロパティの1つはブール値です。datagridviewのその列をチェックボックスタイプにカスタマイズしました。

バインディングリストから値が取り込まれた行のdatagridviewが読み込まれると、正常に機能します。ただし、「新規エントリ」行が描画されると、チェックボックスセルにSystem.FormatExceptionがスローされます。

正確なエラーメッセージ(関連部分):

DataGridViewで次の例外が発生しました。

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

私の検索では、チェックボックス列のtrue、false、および不確定な値が設定されていない場合にこれが発生する可能性があることが示されました。
私と同様の問題を参照している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";を使用しようとしました 同じ結果になります。

この例外を解決するにはどうすればよいですか?

4

2 に答える 2

1

私はこれを間違って読んでいるかもしれませんが、これは操作の順序の問題のように聞こえます。アイテムをリストに追加するコードが表示されないため、100%確信が持てませんが、新しいオブジェクトをリストに追加してから値を変更していると思います。

ブール値がnullでないことを確認する必要があります。新しいアイテムを追加する場合は、。リストに追加する前に、追加するオブジェクトの値を入力する必要があります。これを確実にする1つの可能な方法は、デフォルト値をfalseまたはtrueに設定するか、コンストラクターでこれを設定することです。

編集-追加

私はこれを自分でテストしませんでしたが、それがあなたのために働くことを願っています。

DataGridViewのDefaultValuesNeededイベントにフックできますか?そのイベントは、例外がスローされる前に発生するはずです。これにより、問題が解決するはずです...

于 2009-10-06T20:50:05.917 に答える
1

はい。このコードを試してください:

private void dataGridViewEpizode_DefaultValuesNeeded(object sender, DataGridViewRowEventArgs e)
    {
        try
        {
            e.Row.Cells[22].Value = false;
        }
        catch (Exception ex)
        {
            mainForm.staticvar.logger.Write(ex);
        }
    }
于 2012-10-19T10:31:11.397 に答える