0

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フォームのデータリピーターでコンボボックスをバインドするより良い方法はありますか?

4

2 に答える 2

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();                
        }
    }
于 2012-10-17T15:41:54.113 に答える