[英]Dynamic combobox list databinding in C# WinForms
已經閱讀了很多該資源並且非常喜歡它,但是現在我遇到了一個問題,既不能自己解決也不能找到類似的解決方案。 我正在使用C#winforms和linqtosql。 在我的用戶窗體中,我使用其他視圖類綁定組合框列表,以使用戶能夠獲取和使用對象的名稱列表,同時禁止獲取整個對象本身。 (無論如何,這不是一個好習慣的問題。)
例如(這不是真正的代碼,僅用於查看):ORM類:
public class Contract
{
public string ID { get; set; }
public string Name { get; set; }
public Contractor Contractor { get; set; }
public string ContractorID { get; set; }
}
public class Contractor
{
public string ID { get; set; }
public string Name { get; set; }
public string Phone { get; set; }
}
這是為sqlserver視圖Contractor_List
映射的附加視圖類(SELECT c.ID, c.Name FROM Contractors c)
public class Contractor_List
{
public string ID { get; set; }
public string Name { get; set; }
}
用戶表格:
public class ContractForm : Form
{
void Init()
{
TextBox nameBox = new TextBox();
ComboBox contractorBox = new ComboBox();
BindingSource contractSource = new BindingSource();
contractSource.DataSource = typeof (Contract);
nameBox.DataBindings.Add("Text", contractSource, "Name", false, DataSourceUpdateMode.OnValidation);
contractorBox.DataBindings.Add("SelectedValue", contractSource, "ContractorID", false, DataSourceUpdateMode.OnValidation);
BindingSource contractorListSource = new BindingSource();
contractorListSource.DataSource = typeof (Contractor_List);
contractorBox.DisplayMember = "Name";
contractorBox.ValueMember = "ID";
}
}
好。 我的想法是在設置contractorBox.SelectedValue時加載contractorBox.DataSource(它的綁定源)。 我發現SelectedValue不可覆蓋,因此我決定繼承combobox,並在其中創建一個名為“ ID”的新屬性,並按照以下格式進行操作:
contractorBox.DataBindings.Add("ID", contractSource, "ContractorID");
在控制中(這是真實的代碼):
object _id;
bool _listInitialized;
public object ID
{
get
{
return _id;
}
set
{
if (!_listInitialized)
{
var bindingSource = DataSource as BindingSource;
if (bindingSource != null)
{
var t = (bindingSource.DataSource as Type);
var rst = … //Getting List
if (rst!=null)
{
bindingSource.DataSource = rst;
_listInitialized = true;
SelectedValueChanged += delegate {
if (SelectedValue != ID)
{
ID = SelectedValue;
}
};
}
}
}
else
{
_id = value;
if (SelectedValue != ID)
{
SelectedValue = value;
}
}
}
}
因此,此代碼可以正常工作。 我可以加載表單,合同對象和承包商列表,並在組合框中獲取正確的承包商名稱。 但。 我在支持“ ID”屬性的綁定時遇到問題。 更改組合框內的承包商時,合同對象不會更新( ContractorID
,也沒有Contractor
本身),而組合框的ID
, SelectedValue
和SelectedItem
正確更改。 為什么? 我要怎么做才能使其正常工作。
哈哈 如此簡單的解決方案。
public new object SelectedValue
{
get
{
return base.SelectedValue;
}
set
{
if (!DesignMode)
{
if (!_listInitialized)
{
var bindingSource = DataSource as BindingSource;
if (bindingSource != null)
{
var t = (bindingSource.DataSource as Type);
var rst = ...///how you get your type list
if (rst != null)
{
bindingSource.DataSource = rst;
_listInitialized = true;
}
}
}
else
{
base.SelectedValue = value;
}
}
}
}
可能會對某人有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.