Combobox を Windows フォームのデータ リピーターに適切にバインドする方法を誰かが提案してくれれば幸いです。
データ リピーターを含む Windows フォームを作成しました。データの繰り返しには、テキスト ボックスとコンボ ボックスが含まれています。「Value」と「OverflowBehaviour」という 2 つの列を持つデータ テーブルを含むデータセットがあります。テキストボックスを「Value」に、コンボボックスを「OverflowBehaviour」にバインドしました。次のコードは、データセットを作成し、それをテキスト ボックスとコンボ ボックスにバインドする方法を示しています。
private void Form1_Load(object sender, EventArgs e)
{
bindingsource = new BindingSource();
ds = new DataSet("Preferences");
DataTable table = new DataTable("Preference");
table.Columns.Add("Value");
table.Columns.Add("OverflowBehaviour");
for (int i = 1; i <= 8; i++)
{
if (i < 5)
table.Rows.Add(i, ValueTypeAutoIncrementOverflowBehaviour.Exception);
else
table.Rows.Add(i, ValueTypeAutoIncrementOverflowBehaviour.Wrap);
}
ds.Tables.Add(table);
bindingsource.DataSource = ds;
bindingsource.DataMember = "Preference";
textBox1.DataBindings.Add(new Binding("Text", bindingsource, "Value", true, DataSourceUpdateMode.OnValidation));
comboBox1.DataBindings.Add("SelectedItem", bindingsource, "OverflowBehaviour", false, DataSourceUpdateMode.OnValidation);
dataRepeater.DataSource = bindingsource;
}
「OverflowBehaviour」は、次のように定義された列挙型です。
public enum ValueTypeAutoIncrementOverflowBehaviour
{
Wrap,
Exception,
}
この投稿ComboBox On DataRepeater Control Shares Selected Indexから、ItemCloned イベントでコンボボックスのデータ ソースを手動でマップする必要があることを読みました。
void dataRepeater_ItemCloned(object sender, Microsoft.VisualBasic.PowerPacks.DataRepeaterItemEventArgs e)
{
var Combo = (ComboBox)e.DataRepeaterItem.Controls.Find("comboBox1", false)[0];
Combo.DataSource = System.Enum.GetValues(typeof(ValueTypeAutoIncrementOverflowBehaviour));
}
同じ投稿で提案されているように、DrawItem も実装しました。コードを以下に示します。
void dataRepeater_DrawItem(object sender, Microsoft.VisualBasic.PowerPacks.DataRepeaterItemEventArgs e)
{
var DataRepeater = (Microsoft.VisualBasic.PowerPacks.DataRepeater)sender;
var Combo = (ComboBox)e.DataRepeaterItem.Controls.Find("comboBox1", false)[0];
Combo.SelectedItem = ((List<ValueTypeAutoIncrementOverflowBehaviour>)DataRepeater.DataSource)[e.DataRepeaterItem.ItemIndex];
}
しかし、プロジェクトを実行すると、最後の行にエラー メッセージが表示されて失敗しました。エラー メッセージは、タイプ 'System.Windows.Forms.BindingSource' のオブジェクトをタイプ 'System.Collections.Generic.List`1[WindowsFormsApplication1.Form1+ValueTypeAutoIncrementOverflowBehaviour] にキャストするエラーです。投稿に示されている DataRepeater.DataSource 内のどのフィールドにもアクセスできませんでした。
誰でも解決策を提案できますか? Windowsフォームのデータリピーターでコンボボックスをバインドするより良い方法はありますか?