已经阅读了很多这个资源并且非常喜欢它,但是现在我遇到了一些问题,我既不能自己解决也不能找到类似的解决方案 . 我正在使用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;
}
}
}
}
所以,这段代码工作正常 . 我可以加载表格, Contract 对象和承包商列表,并在组合框中获得正确的承包商名称 . 但 . 我有支持“ID”属性绑定的问题 . 当组合框中的承包商更改时,合并对象不会更新( ContractorID
,没有 Contractor
本身),而组合框的 ID
, SelectedValue
和 SelectedItem
正确更改 . 为什么?我该怎么做才能使这个工作 .
1 回答
哈 . 简单的解决方案 .
可能会对某人有所帮助 .