如果有人可以向我推荐如何将Windows框架中的Combobox正确绑定到数据转发器,我感激不尽。
我创建了一个带有数据转发器的Windows窗体。数据中继器包含文本框和组合框。我有一个数据集,其中包含一个包含2列的数据表,即“Value”和“OverflowBehaviour”。我将文本框绑定到“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窗体中绑定数据中继器中的组合框?
答案 0 :(得分:1)
你可以试试这个:
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));
}
void dataRepeater_DrawItem(object sender, Microsoft.VisualBasic.PowerPacks.DataRepeaterItemEventArgs e)
{
var Combo = (ComboBox)e.DataRepeaterItem.Controls["comboBox1"];
if (ds.Tables["Preference"].Rows[e.DataRepeaterItem.ItemIndex]["OverflowBehaviour"].ToString() == "Exception")
{
Combo.Text = "Exception";
}
else
{
Combo.Text = "Wrap";
}
}
void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
var combo = (ComboBox)sender;
var DataRepeaterItem = (Microsoft.VisualBasic.PowerPacks.DataRepeaterItem)combo.Parent;
//Update dataset
if (ds.Tables["Preference"].Rows[DataRepeaterItem.ItemIndex]["OverflowBehaviour"].ToString() != combo.SelectedItem.ToString())
{
ds.Tables["Preference"].Rows[DataRepeaterItem.ItemIndex]["OverflowBehaviour"] = combo.SelectedItem.ToString();
}
}
答案 1 :(得分:0)
最近我必须使用这个控件...所以我也遇到了这个问题,我解决了它:
control.DataBindings.Add(“ DataSource ”,MyList,“theField”)
希望有所帮助