【问题标题】:Load of Combo Box does not display selected value组合框的负载不显示所选值
【发布时间】:2013-06-12 22:42:30
【问题描述】:

我在表单上有一个组合框 - “cboCurPartNum”。当我打开表单并且现有数据填充表单时,我的组合框不显示存储在 SQL Server 中的值。

如何让我的组合框显示记录中的值?

这里发生的是表单以“修改工程订单”模式打开。所以,声明

public EngOrd engord;

包含正在打开的工程订单的数据。

问题在于“修改工程订单”部分中的"addEngOrd" = false。您将在此处看到方法“PutNewEngOrd()”被调用,newEngOrd 对象被分配了打开的工程订单的现有值。

我的问题是组合框“cboCurPartNum”具有以下设置:

Data Source - partBindingSource
Display Member - PartNumber
Value Member - PartNumber
Selected Value - engOrderBindingSource - CurPartNum

此组合框应分配“newEngOrd”中的部件号,因为“engordBindingSource.Add(newEngOrd);”在“PutNewEngOrd()”运行后被调用。

为什么我的部件号没有显示在组合框中?零件编号存储在数据库中。

这是我的代码:

public partial class frmEngOrdAddModify : Form
{
    public frmEngOrdAddModify()
    {
        InitializeComponent();            
    }

    public bool addEngOrd;  //indicates if adding to the form or not
    public EngOrd engord; //data from the frmEngOrd (old eng order)
    private EngOrd newEngOrd;  //new data we are capturing here (new eng ord)


    private void frmEngOrdAddModify_Load(object sender, EventArgs e)
    {
        this.LoadComboBoxes();           

        if (addEngOrd)
        {
            this.Text = "Add Engineering Order";
            newEngOrd = new EngOrd();
            engordBindingSource.Clear();
        }
        else
        {
            this.Text = "Modify Engineering Order";
            newEngOrd = new EngOrd();                
            this.PutNewEngOrd();
        }
        engordBindingSource.Add(newEngOrd);  //put the existing or a new EngOrd dataset with the binding source


    }

    private void LoadComboBoxes()
    {

        List<EngOrdType> engOrdTypeList;
        engOrdTypeList = EngOrdTypeDB.GetEngOrdType();
        cboEOFileType.DataSource = engOrdTypeList;
        cboEOFileType.SelectedIndex = -1;

        List<Customer> customerList;
        customerList = CustomerDB.GetCustomerTeamList();
        cboCustomer.DataSource = customerList;
        cboCustomer.SelectedIndex = -1;

        List<Part> partList;
        partList = PartDB.GetPartList();
        cboCurPartNum.DataSource = partList;            
        cboCurPartNum.SelectedIndex = -1;

        // with modify mode intially display the value passed in from engord
        if (addEngOrd == false)
        {
            MessageBox.Show("assign here " + engord.CurPartNum);
            cboCurPartNum.SelectedValue = engord.CurPartNum;
        }
    }

    private void PutNewEngOrd()
    {
        newEngOrd.EO = engord.EO;
        newEngOrd.EONum = engord.EONum;
        newEngOrd.FileType = engord.FileType;
        newEngOrd.JobNum = engord.JobNum;
        newEngOrd.QuoteNum = engord.QuoteNum;
        newEngOrd.CustID = engord.CustID;
        newEngOrd.CurPartNum = engord.CurPartNum;            

    }

}

这是设计器为“cboCurPartNum”生成的代码

this.cboCurPartNum.DataBindings.Add(new System.Windows.Forms.Binding("SelectedValue", this.engordBindingSource, "CurPartNum", true));
this.cboCurPartNum.DataSource = this.partBindingSource;
this.cboCurPartNum.DisplayMember = "PartNumber";
this.cboCurPartNum.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cboCurPartNum.FormattingEnabled = true;
this.cboCurPartNum.Location = new System.Drawing.Point(142, 23);
this.cboCurPartNum.Name = "cboCurPartNum";
this.cboCurPartNum.Size = new System.Drawing.Size(179, 21);
this.cboCurPartNum.TabIndex = 11;
this.cboCurPartNum.ValueMember = "PartNumber";
this.cboCurPartNum.SelectionChangeCommitted += new System.EventHandler(this.cboCurPartNum_SelectionChangeCommitted_1)

这就是我现在拥有的: 这就是我现在所拥有的。设置 SelectedValue 需要什么?

        private void LoadComboBoxes()
    {

        List<EngOrdType> engOrdTypeList;
        engOrdTypeList = EngOrdTypeDB.GetEngOrdType();
        cboEOFileType.DataSource = engOrdTypeList;
        cboEOFileType.SelectedIndex = -1;

        List<Customer> customerList;
        customerList = CustomerDB.GetCustomerTeamList();
        cboCustomer.DataSource = customerList;
        cboCustomer.SelectedIndex = -1;
        //MessageBox.Show(cboCustomer.SelectedItem.ToString());
        //MessageBox.Show(cboCustomer.SelectedValue.ToString());

        List<Part> partList;
        partList = PartDB.GetPartList();
        cboCurPartNum.DataSource = partList;
        cboCurPartNum.SelectedIndex = -1;
        if (addEngOrd == false)
        {
            cboCurPartNum.SelectedItem = partList[1];

        }

    }

【问题讨论】:

  • 确保 DataSource 不是 Null 或 Empty。为了能够在该组合框中显示选定的值,您应该使用从中获取 SelectedItem 的集合填充 DataSource
  • 组合框具有来自数据源“partBindingSource”的值。存储在数据库中的值是数据源中的有效值。
  • @Nancy 你确定CurPartNumPartNumber 的数据类型是一样的吗?他们应该是一样的。我认为CurPartNum 的所有可能值都包含在PartNumber 列中,否则就是问题所在。
  • CurPartNum 和 PartNumber 的数据类型相同。 CurPartNum 最初使用 partBindingSource.PartNumber 中的值之一保存

标签: c# .net winforms


【解决方案1】:

cboCurPartNum.SelectedValue = /这里你应该设置一个“Part”类型的项目。例如 partList[0]/

public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();
      LoadComboboxes();
    }

    public void LoadComboboxes() {
        List<Part> partList = PartDB.GetPartList();
        cboCurPartNum.DataSource = partList;
        cboCurPartNum.SelectedIndex = -1;
        var addEngOrd = false;
        if (addEngOrd  == false) {
          //MessageBox.Show("assign here " + 1);
          cboCurPartNum.SelectedItem = partList[1];
        }
    }
  }
  public static class PartDB {
    static PartDB() {
      PartList = new List<Part> {
        new Part {
          One = 1,
          Two = "unos"
        },
        new Part {
          One = 2,
          Two = "duos"
        }
      };
    }

    private static readonly List<Part> PartList;
    public static List<Part> GetPartList() {
      return PartList;
    }
  }

  public class Part {
    public int One { get; set; }
    public string Two { get; set; }
  }
}

另外,确保 DisplayMember 设置为您想在组合框中看到的属性(见附件)

【讨论】:

  • 完整解决方案写给我:)
  • 我该怎么写你?我是这个论坛的新手。如何设置 SelectedValue?
  • 我发现了问题。使用 partBindingSource 的数据中有回车。此数据来自另一个系统。
【解决方案2】:

我看不到您在哪里为您的 ComboBox 设置 DisplayMember 属性 - 它是在 Designer 生成的代码中吗? 尝试以编程方式设置 DisplayMember 属性并重新检查 DisplayMember 值是否与需要显示的 Part 类属性的名称匹配。

【讨论】:

  • 另外 - 其他到 ComboBoxes 查看值?问题是否仅在 cboCurPartNum ComboBox 中显示?
  • 其他组合框正在查看这些值。在设计器生成的代码中设置了 DisplayMember。
  • 问题只出在 cboCurPartNum
  • PartNumber 属性的类型是什么?这个属性的 getter 是什么样子的?
  • 私有字符串部件号;公共字符串 PartNumber{ get{ return partnumber;} set{ partnumber = value; } }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-26
  • 1970-01-01
  • 1970-01-01
  • 2013-12-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多