已经阅读了很多这个资源并且非常喜欢它,但现在我遇到了一个问题,我既不能自己解决也不能找到类似的解决方案。 我使用的是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是不可覆盖的,所以我决定继承组合框并在其中创建一个名为“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
正确更改。
为什么?我该怎么做才能使这个工作。
答案 0 :(得分:1)
哈。如此简单的解决方案。
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;
}
}
}
}
可能会对某人有所帮助。