C# 将dropdownlist的选定项设置为windows窗体c中匹配的字符串值

C# 将dropdownlist的选定项设置为windows窗体c中匹配的字符串值,c#,winforms,dropdown,selectedindex,C#,Winforms,Dropdown,Selectedindex,我的windows窗体应用程序上有一个下拉列表,其中包含制造商的名称。在编辑给定记录时,我希望用户能够编辑并更改制造商。其余的值工作正常,我可以轻松地将它们分配到文本框中,在文本框中它们将被编辑并再次存储在数据库中 我已经查询了下拉列表项需要从数据库中编辑的制造商名称,现在我想在下拉列表中将其显示为所选项。我使用以下代码根据数据库中的id查询特定制造商,并将其分配给字符串变量manufacturerName 调试这段代码后,字符串manfuacturerName保留了我想在下拉列表中更改的确切制

我的windows窗体应用程序上有一个下拉列表,其中包含制造商的名称。在编辑给定记录时,我希望用户能够编辑并更改制造商。其余的值工作正常,我可以轻松地将它们分配到文本框中,在文本框中它们将被编辑并再次存储在数据库中

我已经查询了下拉列表项需要从数据库中编辑的制造商名称,现在我想在下拉列表中将其显示为所选项。我使用以下代码根据数据库中的id查询特定制造商,并将其分配给字符串变量manufacturerName

调试这段代码后,字符串manfuacturerName保留了我想在下拉列表中更改的确切制造商名称。现在,我想在下拉列表中将此特定项标记为选中项。我想把它传递给列表,这样它就可以在列表中选择这个特定的制造商

到目前为止,我已经尝试了以下代码,但它不起作用

childEditProduct.cmbManufacturer.SelectedIndex = childEditProduct.cmbManufacturer.FindString(manufacturerName);

注意:我已在childEditProduct表单加载中将第一项标记为selectedIndex。我也对代码进行了注释,但没有任何效果。我的代码中是否存在任何问题,或者让我尝试一些更有效的方法来解决我的问题。

要解决这个问题并避免将来出现更复杂的代码,最好阅读DisplayMember、ValueMember属性

要使前两种方法有效,只需执行以下操作:

public class Manufacturer
{
    public int Id { get; set; } //Important to have get/set othervise DisplayMember and ValueMember properties will not work
    public string Name { get; set; } //Important to have get/set othervise DisplayMember and ValueMember properties will not work


    public static List<Manufacturer> GetAllManufacturers()
    {
        List<Manufacturer> list = new List<Manufacturer>();

        //Read manufacturers one by one, create object of Manufacturer and then add that object to list

        return list;

    }
}


//This code below set in form constructor or on load

cmbManufacturer.DisplayMember = "Name";
cmbManufacturer.ValueMember = "Id;
cmbManufacturer.DataSource = Manufacturer.GetAllManufacturers();


//And now when you need to select manufacturer by id you do
cmbManufacturer.SelectedValue = 6; //Will select manufacturer which has id 6


//If you have updated your manufacturers in runtime and want to again load everything in combobox just do

cmbManufacturer.DataSource = Manufacturer.GetAllManufacturers();
对于这样的类,我们有关于制造商的附加信息,但是如何显示或存储它呢?好了,我们的标签来了

标记是一种对象类型,它包含您想要的任何其他对象

现在我们像上面一样绑定DisplayMember和ValueMember,但现在我们不直接绑定datasource,而是首先将列表保存到单独的变量:

List<Tuple<string, Manufacturers>> man = Manufacturer.GetAllManufacturers();
cmbManufacturer.DisplayMember = "item1"; //We use item1 and item2 since those are names of variables in Tuple<T>
cmbManufacturer.ValueMember = "item2"; //We use item1 and item2 since those are names of variables in Tuple<T>
cmbManufacturer.DataSource = man;
因为我们选择的值不代表int,而是代表制造商

我们所能做的就是在表单中创建函数来选择它

private void SelectManufacturerById(int id)
{
    for(int i = 0; i < cmbManufacturer.Items.Count; i++)
    {
        Manufacturer m = (cmbManufacturer.Items[i] as Tuple<string, Manufacturer>).item2;
        if(m.Id == id)
        {
            cmbManufacturer.SelectedItem = cmbManufacturer.Items[i];
            return;
        }
    }
    // Here throw some message since it couldn't find it 
}
然后在表单的combobox中执行类似的操作

Manufacturer m = cmbManufacturer.SelectedValue as Manufacturer; //We will get currently selected manufacturer inside combobox
m.Name = "Here we change name of it";
m.Update(); //Here we run function inside our class and it will update database and new name

正如我上面提到的,第一个代码将解决您的问题,让您的生活更轻松,但如果您习惯了第二个代码,您将看到更多的可能性。

当我使用以下函数在我的子窗体加载事件上加载制造商下拉列表时:

private void LoadManufacturers()
{
    cmbManufacturer.Items.Clear();
    DataTable dtManufacturers = DataAccess.Select("select manufacturername from tblmanufacturer order by manufacturername asc");
    foreach (DataRow dr in dtManufacturers.Rows)
    {
        cmbManufacturer.Items.Add(dr[0].ToString());
    }
    //cmbManufacturer.SelectedIndex = 0;
}
在页面加载事件上加载制造商时,我还使用代码cmbmacturer.SelectedIndex=0指定下拉列表的选定索引;后来我把它评论掉了

完成后,我将重新计算并重新查询用户希望在下拉列表的加载事件中更新的选定制造商,如下所示:

public class Manufacturer
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string City { get; set; }
    public string PersonInCharge { get; set; }
    public string PhoneNumber { get; set; }

    public static List<Tuple<string, Manufacturer>> GetAllManufacturers()
    {
        //This one i will make example with interaction to database

        List<Tuple<string, Manufacturer>> list = new List<Tuple<string, Manufacturer>>();

        using(SqlConnection con = new SqlConnection("SomeSqlString"))
        {
            con.Open();
            using(SqlCommand cmd = new SqlCommand("Select Id, Name, City, Person, Phone from Manufacturers", con))
            {
                SqlDataReader dr = cmd.ExecuteReader();

                while(dr.Read()) //Will read one by one line
                {
                    Manufacturer m = new Manufacturer();
                    m.Id = Convert.ToInt32(dr[0]);
                    m.Name = dr[1].ToString();
                    m.City = dr[2].ToString();
                    m.PersonInCharge = dr[3].ToString();
                    m.PhoneNumber = dr[4].ToString();
                    list.Add(new Tuple<string, Manufacturer>(m.Id, m));
                }
            }
        }
        return list;
    }
}
cmbManufacturer.SelectedValue = 6; //Will select manufacturer which has id 9
private void frmChildEditProduct_Load(object sender, EventArgs e)
{
    LoadManufacturers(); // Calling the loadManufacturers function to load all the manufacturers to the dropdown list.

    string manufacturerID = lblManufacturerId.Text;

    DataTable dtMName = Products.SelectByManufacturerId(manufacturerID);
            if (dtMName.Rows.Count > 0)
            {
                foreach (DataRow manufacturer in dtMName.Rows)
                {
                    string manufacturerName = manufacturer[0].ToString();
                    cmbManufacturer.SelectedIndex = Convert.ToInt32(cmbManufacturer.FindStringExact(manufacturerName));
                }
            }
 }

我的问题解决了。感谢您对Stackoverflow的支持。

@RufusL我已将当前制造商名称放入字符串manufacturerName中,以便通知下拉列表仅选择名称与字符串manufacturerName匹配的制造商。这就是我想要的do@RufusL我只想选择与字符串manufacturerName匹配的下拉列表项。我不想替换它。相反,我希望允许我的用户更新它。i、 e将制造商从制造商A更改为制造商B。但我希望保留下拉列表中选择的制造商A,无论用户是否编辑它!产品实际上是一个我定义了函数的类。因此,我使用SelectByManufacturerId函数通过传递特定的manufacturerId来查询该类中的manufacturerName。好的,也许您可以澄清这个问题,因为我不太清楚问题是什么。如果组合框包含manufacturerName,那么代码应该可以正常工作。也许您可以生成一个小样本代码,重现您的问题,我们可以将其复制/粘贴到新的解决方案中?
private void LoadManufacturers()
{
    cmbManufacturer.Items.Clear();
    DataTable dtManufacturers = DataAccess.Select("select manufacturername from tblmanufacturer order by manufacturername asc");
    foreach (DataRow dr in dtManufacturers.Rows)
    {
        cmbManufacturer.Items.Add(dr[0].ToString());
    }
    //cmbManufacturer.SelectedIndex = 0;
}
private void frmChildEditProduct_Load(object sender, EventArgs e)
{
    LoadManufacturers(); // Calling the loadManufacturers function to load all the manufacturers to the dropdown list.

    string manufacturerID = lblManufacturerId.Text;

    DataTable dtMName = Products.SelectByManufacturerId(manufacturerID);
            if (dtMName.Rows.Count > 0)
            {
                foreach (DataRow manufacturer in dtMName.Rows)
                {
                    string manufacturerName = manufacturer[0].ToString();
                    cmbManufacturer.SelectedIndex = Convert.ToInt32(cmbManufacturer.FindStringExact(manufacturerName));
                }
            }
 }