c#数据中继器中的组合框绑定



如果有人能建议我如何以windows形式将组合框正确绑定到数据中继器,我将不胜感激。

我创建了一个带有数据中继器的windows窗体。数据中继器包含一个文本框和一个组合框。我有一个数据集,它包含一个有两列的数据表,即"Value"one_answers"OverflowBehavior"。我把文本框绑定到"Value",把组合框绑定到了"OverflowBehavior"。以下代码显示创建数据集并将其绑定到文本框和组合框:

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;            
}

"OverflowBehavior"是一个枚举,定义如下:

public enum ValueTypeAutoIncrementOverflowBehaviour 
{ 
Wrap, 
Exception, 
}

我从这篇关于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。表格。BindingSource"到类型"System。集合。通用的列表`1[WindowsFormsApplication1.Form1+ValueTypeAutoIncrementOverflowBehavior]。我无法访问DataRepeater中的任何字段。DataSource,这在帖子中显示。

有人能提出解决方案吗?有没有更好的方法在windows形式的数据中继器中绑定组合框?

你可以试试这个:

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();                
}
}

最近我不得不使用这个控件。。。所以我也遇到了这个问题,我用解决了它

控制。DataBindings。添加("数据源"、MyList、"字段")

希望它能帮助

最新更新