[WIN]將資料Bind到UserControl上,只會Bind到第1筆?
問題
今天幫同事查一個UserControl上Binding的問題,在Form上將資料Bind到UserControl上的控制項時,發現當資料切換到不同列時,UserControl上的控制項並不會跟著更新,一直都停留在第1筆的資料!
研究及解決
只好一步一步的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:從零開始的軟體開發生活」
請大家繼續支持 ^_^