c#数据中继器中的Combobox绑定

时间:2012-10-16 21:11:49

标签: c# data-binding combobox datarepeater

如果有人可以向我推荐如何将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窗体中绑定数据中继器中的组合框?

2 个答案:

答案 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”)

希望有所帮助