[WIN]將資料Bind到UserControl上,只會Bind到第1筆?

[WIN]將資料Bind到UserControl上,只會Bind到第1筆?

問題

今天幫同事查一個UserControl上Binding的問題,在Form上將資料Bind到UserControl上的控制項時,發現當資料切換到不同列時,UserControl上的控制項並不會跟著更新,一直都停留在第1筆的資料!

image

研究及解決

只好一步一步的Trace,後來發現那個UserControl內有個ComboBox,只要把DataTable給Assign它的DataSource,就會發生這個狀況!

上網找也沒有人有這樣的問題,才在想說該不會要手動一筆筆自已新增Item給它,可是又有點不甘心~~

所以就再建立一個UserControl,再放個ComboBox,然後設定它的DataSource,測試看看! 結果居然可以正常運作。

詳細一看,原來之前那個不能運作的UserControl設定ComboBox的DataSource是在UserControl的建構式中,而可以運作的UserControl設定ComboBox的DataSource則是在UserControl的Load事件中!

天呀~ 就這樣一個小地方,查了好久哦~ 鳴~~ 還被同事一直問說,這個問題會很難嗎?  真不知要如何回答~~

程式如下,

使用者控制項(UserControl1.cs),畫面放一個TextBox(textBox1)及一個ComboBox(comboBox1),並將Modifiers屬性設成Public,這樣Form1才存取得到它們!

public partial class UserControl1 : UserControl
{
    public UserControl1()
    {
        InitializeComponent();
        //如果在建構子這裡Assign資料給ComboBox
        //外面的Binding就只會Bind到第1筆,
        //不會跟著資料列改變,而Bind到正確的值
        //BindData2ComBoBox();
    }
    /// <summary>
    /// 將資料Bind到ComboBox之中
    /// </summary>
    private void BindData2ComBoBox()
    {
        DataTable comboBoxDataTable = new DataTable("comboBoxDataSource");
        comboBoxDataTable.Columns.Add("C1", typeof(string));
        comboBoxDataTable.Columns.Add("C2", typeof(string));
        comboBoxDataTable.Rows.Add("C1_V1", "C2_V1");
        comboBoxDataTable.Rows.Add("C1_V2", "C2_V2");
        comboBox1.DataSource = comboBoxDataTable;
        comboBox1.ValueMember = "C1";
        comboBox1.DisplayMember = "C2";
    }

	

	
    private void UserControl1_Load(object sender, EventArgs e)
    {
        //在Load事件中Bind ComboBox才不會有問題
        //BindData2ComBoBox();
    }
}

表單(Form1.cs)上把UserControl1控制項拉到畫面上,並拉1個dataGridView(dataGridView1)及一個Button(btnBindData),Button按下後,就將資料Bind到dataGridView上,並設定與UserControl1的DataBinding。

public partial class Form1 : Form
{
    /// <summary>
    /// 表單上的資料
    /// </summary>
    private DataTable comboBoxDataTable = new DataTable("myDataSource");
    private BindingManagerBase glDataBindingManager;
    public Form1()
    {
        InitializeComponent();
        //先建立資料
        comboBoxDataTable.Columns.Add("C1", typeof(string));
        comboBoxDataTable.Columns.Add("C2", typeof(string));
        comboBoxDataTable.Rows.Add("C1_V1", "C2_V1");
        comboBoxDataTable.Rows.Add("C1_V2", "C2_V2");
    }

	
    

	
    private void btnBindData_Click(object sender, EventArgs e)
    {
        //將資料Bind到dataGridView上
        dataGridView1.DataSource = comboBoxDataTable;
        //設定與使用者控制項的DataBinding
        userControl11.textBox1.DataBindings.Add("Text", comboBoxDataTable, "C1");
        userControl11.comboBox1.DataBindings.Add("SelectedValue", comboBoxDataTable, "C1");
        glDataBindingManager = this.BindingContext[comboBoxDataTable];
    }
}

測試程式

 

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^