Не могу программно установить выбор ComboBox - PullRequest
0 голосов
/ 12 июня 2018

Я не могу программно установить выбор в ComboBox.Я пытаюсь установить различные свойства (SelectedItem, SelectedText, SelectedIndex), но ComboBox не отображает имя.Первый ряд ComboBox, который является пустым, выбран.Возвращаемое значение настройки свойства является правильным.
Что я делаю не так?

...
this.bsConstructionContractors.DataSource = typeof(Contractor);
...
public partial class EditContractorDialog : Form
{
    public EditContractorDialog(Contractor contractor)
    {
        InitializeComponent();

        this.cmbEditContractorName.DataBindings.Add(new System.Windows.Forms.Binding("SelectedValue", projectView.bsProject, "ContractorId", true));
        // new BindingSource is important here, so as to use a separate CurrencyManager
        // because bsConstructionContractors is shared with another ComboBox on another form
        this.cmbEditContractorName.DataSource = new BindingSource(projectView.bsConstructionContractors, null);
        this.cmbEditContractorName.ValueMember = "ContractorId";
        this.cmbEditContractorName.DisplayMember = "Name";

         cmbEditContractorName.Enabled = true;
         cmbEditContractorName.Focus();

        // None of the following cause the ComboBox to display Contractor.Name
        // The first entry in the ComboBox, which is a blank, is displayed
        object myObject = cmbEditContractorName.SelectedItem = contractor; 
        System.Diagnostics.Trace.WriteLine("EditContractorDialog(): myObject: " + myObject.GetType()); // type is Contractor
        System.Diagnostics.Trace.WriteLine("EditContractorDialog(): myObject: " + myObject); // myObject is the contractor

        object myObject2 = cmbEditContractorName.SelectedText = contractor.Name;
        System.Diagnostics.Trace.WriteLine("EditContractorDialog(): myObject2: " + myObject2.GetType()); // type is String
        System.Diagnostics.Trace.WriteLine("EditContractorDialog(): myObject2: " + myObject2); // myObject2 is the contractor.Name

        object myObject3 = cmbEditContractorName.SelectedIndex = 3; // arbitrary index, just to see if it would be selected
        System.Diagnostics.Trace.WriteLine("EditContractorDialog(): myObject3: " + myObject3.GetType()); // type is Int32
        System.Diagnostics.Trace.WriteLine("EditContractorDialog(): myObject3: " + myObject3); // myObject3 = 3
     }
}

public partial class Contractor : System.IComparable
{
    protected int id;
    protected string name;
    protected string licenseNumber;
    protected Project project;

    public virtual int ContractorId
    {
        get { return this.id; }
        set { this.id = value; }
    }

    public virtual string Name
    {
        get { return this.name; }
        set { this.name = value; }
    }

    public virtual string LicenseNumber
    {
        get { return this.licenseNumber; }
        set
        { this.licenseNumber = value; }
    }

    public virtual int CompareTo(object obj)
    {
        if (!(obj is Contractor))
        {
            throw new System.InvalidCastException("This object is not of type Contractor");
        }
        return this.Name.CompareTo(((Contractor)obj).Name);
    }

}

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Это потому, что вам нужно получить ссылку на объект для назначения из источника данных самого комбобокса.Также для комбинированных списков я предлагаю вам использовать ObservableCollection<T>.

cmbEditContractorName.DataSource = new ObservableCollection<Type>(your List<Type>);
cmbEditContractorName.SelectedItem = ((ObservableCollection<Type>)cmbEditContractorName.DataSource).FirstOrDefault(c=> c.yourProperty = "something"); // this will select the first item meeting your condition

Ваш код не работает, потому что вы присваиваете свойство SelectedItem с ссылкой объекта, не существующегов поле со списком DataSource.

0 голосов
/ 12 июня 2018

Использование SelectedIndex для поиска индекса по имени подрядчика:

cmbEditContractorName.SelectedIndex = cmbEditContractorName.FindString(contractor.Name);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...