如何向绑定到实体的组合框中添加新项
本文关键字:组合 添加 新项 实体 绑定 | 更新日期: 2023-09-27 18:10:28
c#生成的设计类:
//
// usepurposeComboBox
//
this.usepurposeComboBox.DataSource = this.usepurposeBindingSource;
this.usepurposeComboBox.DisplayMember = "Name";
this.usepurposeComboBox.FormattingEnabled = true;
this.usepurposeComboBox.Location = new System.Drawing.Point(277, 53);
this.usepurposeComboBox.Name = "usepurposeComboBox";
this.usepurposeComboBox.Size = new System.Drawing.Size(218, 21);
this.usepurposeComboBox.TabIndex = 4;
this.usepurposeComboBox.ValueMember = "id";
//
// usepurposeBindingSource
//
this.usepurposeBindingSource.DataSource = typeof(mydatabaseEntities.usepurpose);
然后我将BindingSource (usepurposeBindingSource)绑定到Entities:
usepurposeBindingSource.DataSource = mydatabaseEntities.usepurposes;
我不能给usepurposeComboBox添加新行因为它被绑定了。
最简单的方法是在dataTable中添加一个新行,然后将comboBox绑定到它,就像这样:
Company comps = new Company();
//pupulate dataTable with data
DataTable DT = comps.getCompaniesList();
//create a new row
DataRow DR = DT.NewRow();
DR["c_ID"] = 0;
DR["name"] = "Add new Company";
DR["country"] = "IR";
//add new row to data table
DT.Rows.Add(DR);
//Binding DataTable to cxbxCompany
cxbxCompany.DataSource = DT;
cxbxCompany.DisplayMember = "name";
cxbxCompany.ValueMember = "c_ID";
我假设你想添加例如第一个项目有时称为"Choose One",如果你想要实时数据,你应该看看数据来自哪里,并添加更多的项目到那个"表"。
this.usepurposeBindingSource
是一个对象…为什么不在它结合之前加入呢?
如果是List<T>
就可以
this.usepurposeBindingSource.Insert(0, new T() {
Name = "Choose one",
Id = ""
});
Then Bind()
it…
记住要验证,因为它是一个字符串,而不是你想要的对象
正在运行:
List<MyObject> usepurposeBindingSource { get; set; }
private void FillUpData()
{
// Simulating an External Data
if (usepurposeBindingSource == null || usepurposeBindingSource.Count == 0)
{
this.usepurposeBindingSource = new List<MyObject>();
this.usepurposeBindingSource.Add(new MyObject() { Name = "A", ID = 1 });
this.usepurposeBindingSource.Add(new MyObject() { Name = "B", ID = 2 });
this.usepurposeBindingSource.Add(new MyObject() { Name = "C", ID = 3 });
}
}
private void FillUpCombo()
{
FillUpData();
// what you have from design
// comment out the first line
//this.usepurposeComboBox.DataSource = this.usepurposeBindingSource;
this.usepurposeComboBox.DisplayMember = "Name";
this.usepurposeComboBox.FormattingEnabled = true;
this.usepurposeComboBox.Location = new System.Drawing.Point(277, 53);
this.usepurposeComboBox.Name = "usepurposeComboBox";
this.usepurposeComboBox.Size = new System.Drawing.Size(218, 21);
this.usepurposeComboBox.TabIndex = 4;
this.usepurposeComboBox.ValueMember = "id";
// to do in code:
this.usepurposeBindingSource.Insert(0, new MyObject() { Name = "Choose One", ID = 0 });
// bind the data source
this.usepurposeComboBox.DataSource = this.usepurposeBindingSource;
}
技巧是注释掉DataSource
行,并在您的代码中执行,插入一个元素到您的对象中,该对象来自您的模型
//this.usepurposeComboBox.DataSource = this.usepurposeBindingSource;
最简单的方法是用某种"ViewModel"来包装你的BindingSource。新类将返回一个"完整"的项列表——既包括原始绑定源提供的项,也包括那些"附加"项。
然后可以将新的包装器绑定到组合框。
我之前写过一篇关于这个的文章…这不是我最好的作品,而且可能有点过时了,但它应该能让你达到目的。我自己解决了。我创建了一个新的未绑定组合框,然后将其绑定到一个数据表。我不确定这是不是最好的方法,但对我来说很有效。谢谢你的建议。:)
private void FillCombobox()
{
using (mydatabaseEntities mydatabaseEntities = new mydatabaseEntities())
{
List<usepurpose> usepurposes = mydatabaseEntities.usepurposes.ToList();
DataTable dt = new DataTable();
dt.Columns.Add("id");
dt.Columns.Add("Name");
dt.Rows.Add(-1, "test row");
foreach (usepurpose usepurpose in usepurposes)
{
dt.Rows.Add(usepurpose.id, usepurpose.Name);
}
usepurposeComboBox.ValueMember = dt.Columns[0].ColumnName;
usepurposeComboBox.DisplayMember = dt.Columns[1].ColumnName;
usepurposeComboBox.DataSource = dt;
}
}
查看此链接:http://forums.asp.net/t/1695728.aspx/1?
在asp中,你可以添加这个来插入一个空行:
<asp:DropDownList ID="CustomerDropDownList" runat="server"
DataSourceID="CustomerEntityDataSource" DataTextField="CustomerId"
DataValueField="CustomerId" AppendDataBoundItems="true">
<asp:ListItem Text="Select All Customers" Value="" />
</asp:DropDownList>
或在代码后面:
DropDownList1.AppendDataBoundItems = true;
DropDownList1.Items.Add(new ListItem("Select All Customers", "-1"));