我一直坚持这个问题几天,所以我决定创建一个简单的独立测试项目来展示我的问题。
我正在使用带有C#的visual studio 2008来创建一个Windows窗体应用程序。 我的数据库是SQL Express。我有一个组合框绑定到一个只有两列ID和名称的表。
我的测试应用程序将清洁工与建筑物相匹配。 每个建筑物都可以有一个清洁工,一个清洁工可以拥有许多建筑物。
清洁表有两列 CleanerID CleanerName
建筑表有三列 BuildingID 建筑名称 BuildingCleanerID
如果我用数据手动填充表,那么一切正常。 但是,我希望能够创建新建筑物(如果它们不存在),然后从现有记录中选择一个清洁建筑物。问题是当创建新记录时,先前显示的清洁器仍然在下拉列表中而不是我刚刚创建的新记录的值,即Id 0处的第一个记录,我将其命名为“选择一个”。我试过cleanerNameComboBox.SelectedIndex = 0;在代码中的不同位置,但它似乎没有任何区别。
我已经使用GUI链接了组合框的所有属性。 这是主表单中的代码。 如果有人想要自己测试,我是否可以发布我的测试项目。我可能在这里错过了一些简单的东西,但它让我疯了。
先谢谢大卫。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace ComboBoxTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
//This line of code loads data into the 'testComboDataSet.Cleaner' table. You can move, or remove it, as needed.
this.cleanerTableAdapter.Fill(this.testComboDataSet.Cleaner);
}
private void buttonSearch_Click(object sender, EventArgs e)
{
int rowsFound = this.buildingTableAdapter.FillBuildingByBuildingID(this.testComboDataSet.Building,Convert.ToInt32(buildingIDTextBox.Text));
if (rowsFound == 0)
{
MessageBox.Show("Building Not Found, Create new record","Info");
TestComboDataSet.BuildingRow newbuildingRow;
newbuildingRow = testComboDataSet.Building.NewBuildingRow();
try
{
// Set the initial values
newbuildingRow.BuildingCleanerID = 0;
newbuildingRow.BuildingName = "Not Set";
// Add the row to the building table
this.testComboDataSet.Building.Rows.Add(newbuildingRow);
// Save the Building table row to the database
this.buildingTableAdapter.Update(this.testComboDataSet.Building);
cleanerNameComboBox.SelectedIndex = 0;
//
MessageBox.Show("New Building Created", "Info");
}
catch (System.Exception er)
{
MessageBox.Show("Unable to create new building\n" + er, "Error");
}
}
}
private void buttonSave_Click(object sender, EventArgs e)
{
this.Validate();
this.buildingBindingSource.EndEdit();
this.tableAdapterManager.UpdateAll(this.testComboDataSet);
}
}
}
更新 有些东西正在更新清洁工表中的细节。 不知道这是怎么回事。我只写建筑能干。 我的组合框的数据绑定是否完全错误?
清洁工人表以
开始0选择一个
1清洁剂A
2清洁B
3 Cleaner C
4清洁D
5 Cleaner X
答案 0 :(得分:0)
正如我所料,答案很简单。
真正的问题是我将CleanerName字段(作为组合框)从DataSources标签拖到我的表单上。我应该将整个清洁表(作为组合框)从DataSources选项卡拖到我的表单上。这只是让我设置"选择值"在Building表的BuildingCleanerID控件的属性中。
令人遗憾的是,它在设计师中看起来很相似,但现在它完全按照您的预期工作,代码很简单。
另外为了避免意外更新Cleaners表,我需要更改" DropDown"中的Combobox下拉样式。到" DropDownList"这会阻止用户在下拉框中键入新内容。
像往常一样,我希望这可以帮助其他人解决同样的问题 大卫