1

私はこの日のほとんどの作業をしており、解決策は私を逃れ続けています。私のWinformアプリケーションにはDataGridViewが含まれており、そのうちの2つはドロップダウンリストComboBoxです。奇妙なことに、DataGridViewは正しく配置されているように見えますが、マウスオーバーしたとき、またはDataGridVeiwに関連する他のトリガー可能なイベントがあるときはいつでも、過多なエラーが発生します。具体的には、System.ArgumentExceptionSystem.FormatExceptionの2つの繰り返しエラーが発生しています。これらのエラーの両方のためのメッセージ・テキストは次のとおりです。C#ランタイムエラー: "DataGridViewComboBoxCellの値が有効ではありません"

"DataGridViewComboBoxCell value is not valid. To replace this default dialog please handle the DataError event."

私は単にDataErrorイベントを処理することにより、この問題をマスクする必要はありません。 エラーを引き起こしている問題を解決したい。これは私がリストを移入しています方法です。これを解決する方法について

class ManageProcsRecord 
{ 
    public SectionType PageSection { get; set; } 
    public Int32 ContentID { get; set; } 
    public String Content { get; set; } 
    public Int32 SummaryID { get; set; } 
    public RoleType UserRole { get; set; } 
    public String Author { get; set; } 
    public String SysTime { get; set; } 
} 

public enum SectionType 
{ 
    ESJP_SECTION_HEADER = 1, 
    ESJP_SECTION_FOOTER, 
    ESJP_SECTION_BODY 
} 

public enum RoleType 
{ 
    ESJP_ROLE_NONE = 1, 
    ESJP_ROLE_TEST_ENG, 
    ESJP_ROLE_FEATURE_LEAD, 
    ESJP_ROLE_TEAM_LEAD 
} 

List<ManageProcsRecord> records = 
    this.dbif.GetProcedure(this.procList.ElementAt(selectedIndex).PrimaryKey); 

foreach (ManageProcsRecord record in records) 
{ 
    DataGridViewRow row = new DataGridViewRow(); 
    row.CreateCells(this.dataGridView1); 
    row.Cells[0].ValueType = typeof(SectionType); 
    row.Cells[0].Value = record.PageSection; 
    row.Cells[1].Value = record.Content; 
    row.Cells[2].Value = (record.SummaryID != -1); 
    row.Cells[3].ValueType = typeof(RoleType); 
    row.Cells[3].Value = record.UserRole; 
    row.Cells[4].Value = record.Author; 
    row.Cells[5].Value = record.SysTime; 
    this.dataGridView1.Rows.Add(row);  // error fest starts here 
} 

任意の考えや提案が非常appreciatdです!

答えて

2

あなたはDGVがどのように埋め込まれたか説明しませんでしたが、私はあなたが設計時のセットアップを行ったと仮定します。それらの列挙型からの名前/データを入力した場合、それらは文字列としてタイプされ、一致エラーが発生します。列挙型を使用して、それを移入し、のようなタイプを設定し、それは文句を言わないあなたに叫ぶ:

List<ProcRecord> Records = new List<ProcRecord>(); 

// add some records 
Records.Add(new ProcRecord() 
{ 
    Author = "Ziggy", 
    PageSection = SectionType.ESJP_SECTION_BODY, 
    UserRole = RoleType.ESJP_ROLE_FEATURE_LEAD 
}); 
Records.Add(new ProcRecord() 
{ 
    Author = "Zalgo", 
    PageSection = SectionType.ESJP_SECTION_BODY, 
    UserRole = RoleType.ESJP_ROLE_FEATURE_LEAD 
}); 

// set cbo datasources 
DataGridViewComboBoxColumn col = (DataGridViewComboBoxColumn)dgv1.Columns[0]; 
col.DataSource = Enum.GetValues(typeof(SectionType)); 
col.ValueType = typeof(SectionType); 

col = (DataGridViewComboBoxColumn)dgv1.Columns[4]; 
col.DataSource = Enum.GetValues(typeof(RoleType)); 
col.ValueType = typeof(RoleType); 

あなたはそれらのもののリストを持っている場合は、コントロールに一つずつそれらを手動でコピーする必要はありません。 ListをDGVにバインドするだけです。コントロール内のデータの編集がリストにスルー流れます:それはどのようなことであれば

dgv1.AutoGenerateColumns = false; 
// Show Me the RECORDS!!!! 
dgv1.DataSource = Records; 

enter image description here

あなたの次の障害は、(表示し、日付や時刻のように動作するSysTimeを取得する可能性がありますis)は文字列として定義されているためです。

+0

これは、おかげで、ありがとう!問題は、私が列 'DataSource'をどのように設定していたかであったと思います。 –

関連する問題