C# WinForms ComboBox SelectedValue null

371
11 декабря 2018, 16:10

Когда закрываю форму легко получаю значение SalectedValue ComboBox но перед ShowDialog формы если ставлю SelectedValue для ComboBox, то ComboBox не ставит его. ComboBox внутри TableLayoutPanel вместе с Label. те set SalectedValue не работает и Items = 0, но DataSource в конструкторе установлен

form.EnabledLabeledCheckComboxBox.CheckComboBox.SelectedValue = true;
form.ShowDialog();
MessageBox.Show(form.EnabledLabeledCheckComboxBox.CheckComboBox.SelectedValue.ToString()); // здесь то что я выберу
//////////////////////////////////////////////////////////////////
public class BoolKeyStringValue : BaseVM {
  #region Key
  private bool key;
  public bool Key {
    get => this.key;
    set { 
      this.key = value;
      OnPropertyChanged("Key");
    } 
  }
  #endregion
  #region Value
  private string value;
  public string Value {
    get => this.value;
    set { 
      this.value = value;
      OnPropertyChanged("Value");
    }
  }
  #endregion
  public BoolKeyStringValue(bool key, string value) {
    this.Key = key;
    this.Value = value;
  }
 }
 using System;
 using System.Collections.Generic;
 using System.Collections.ObjectModel;
 using System.ComponentModel;
 using System.Drawing;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 using System.Windows.Forms;
namespace Test {
  public class LabeledCheckComboBox : TableLayoutPanel {
  #region Properties
  #region Label
  private Label label;
  public Label Label {
    get => this.label;
    set => this.label = value;
  }
  #endregion
  #region CheckComboBox
  private ComboBox checkComboBox;
  public ComboBox CheckComboBox {
    get => this.checkComboBox;
    set => this.checkComboBox = value;
  }
  #endregion
  #region Bools
  private List<BoolKeyStringValue> bools;
  public List<BoolKeyStringValue> Bools {
    get => this.bools;
    set => this.bools = value;
  }
  #endregion
  #endregion
  #region Constructors
  public LabeledCheckComboBox() {
  #region Label
  this.Label = new Label();
  this.Label.Dock = DockStyle.Bottom;
  this.Label.Margin = new Padding(0);
  #endregion
  #region Bools
  this.Bools = new List<BoolKeyStringValue>();
  this.Bools.Add(new BoolKeyStringValue(false, "No"));
  this.Bools.Add(new BoolKeyStringValue(true, "Yes"));
  #endregion
  #region Init
  this.Dock = DockStyle.Top;
  this.Margin = new Padding(0, 1, 0, 0);
  this.RowCount = 2;
  this.ColumnCount = 1;
  this.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100));
  this.Controls.Add(this.Label, 0, 0);
  this.CheckComboBox = new ComboBox();
  this.CheckComboBox.Items.AddRange(this.Bools.ToArray());
  this.CheckComboBox.DataSource = this.Bools;
  this.CheckComboBox.DisplayMember = "Value";
  this.CheckComboBox.ValueMember = "Key";
  this.CheckComboBox.Dock = DockStyle.Top;
  this.CheckComboBox.Margin = new Padding(3, 0, 0, 0);
  this.CheckComboBox.FlatStyle = FlatStyle.Flat;
  this.CheckComboBox.DropDownStyle = ComboBoxStyle.DropDownList;
  this.CheckComboBox.Font = new Font("Microsoft Sans Serif", 10, FontStyle.Regular);
  this.Controls.Add(this.CheckComboBox, 0, 1);
  #endregion
  }
  #endregion
  }
}
Answer 1

Читайте документацию (можно прямо в Студии навести мышку на свойство и всплывет подсказка с описанием).

SelectedValue property:

Gets or sets the value of the member property specified by the ValueMember property.

Выделил важное.

Вам, вероятно, следует использовать SelectedItem:

Gets or sets currently selected item in the ComboBox.

Answer 2

Вот такой класс будет элементом в коллекции комбобокса

public class ComboBoxElement
{
    public int Id { get; set; }
    public string Name { get; set; }
}

Вот пример на поиграться. Кстати если напрямую, как вы это делаете назначать SelectedValue значение, то выбранный элемент становится равным null.

public partial class MainView : Form
{
    private BindingSource _bsCombobox = new BindingSource();
    public MainView()
    {
        InitializeComponent();
        SetBindings();
        GetData();
    }
    private void SetBindings()
    {
        _bsCombobox.DataSource = typeof(List<ComboBoxElement>);
        _comboBoxAnimals.DataSource = _bsCombobox;
        _comboBoxAnimals.DisplayMember = "Name";
        _comboBoxAnimals.ValueMember = "Id";
    }
    private void GetData()
    {
        _bsCombobox.DataSource = new List<ComboBoxElement>
        {
            new ComboBoxElement { Id = 1, Name = "Кошка" },
            new ComboBoxElement { Id = 2, Name = "Собака" },
            new ComboBoxElement { Id = 3, Name = "Корова" },
        };
    }
    private void _buttonShow_Click(object sender, EventArgs e)
    {
        //MessageBox.Show((_bsCombobox.Current as ComboBoxElement).Name);
        //или так
        MessageBox.Show((_comboBoxAnimals.SelectedItem as ComboBoxElement).Name);
    }
    private void _buttonSelectCow_Click(object sender, EventArgs e)
    {
        //_comboBoxAnimals.SelectedIndex = _comboBoxAnimals.FindString("Корова");
        //или так
        var element = _bsCombobox.OfType<ComboBoxElement>()
                                .FirstOrDefault(ce => ce.Name.Equals("Корова"));
        _bsCombobox.Position = _bsCombobox.IndexOf(element);
    }
    private void _buttonSelectDog_Click(object sender, EventArgs e)
    {
        ////выбираем собаку
        //_comboBoxAnimals.SelectedIndex = _comboBoxAnimals.FindString("Собака");
        ////изменяем у нее Id, который у нас назначен как ValueMember и сначала =2
        //_comboBoxAnimals.SelectedValue = 1000; //!!! это действие делает SelectedItem = null
        ////и здесь вылетает ошибка, хотя по-идее должно бы быть окошко с 1000
        //MessageBox.Show(_comboBoxAnimals.SelectedValue.ToString());
        //потому лучше так
        var element = _bsCombobox.OfType<ComboBoxElement>()
                                .FirstOrDefault(ce => ce.Name.Equals("Собака"));
        element.Id = 1000;
        _bsCombobox.Position = _bsCombobox.IndexOf(element);
        MessageBox.Show(_comboBoxAnimals.SelectedValue.ToString());
    }
}
READ ALSO
Как корректно отформатировать таблицу Excel, используя C#

Как корректно отформатировать таблицу Excel, используя C#

Всем привет! Появилась задача из полученных данных перекинуть в таблицу и её отформатировать Есть такой вот код:

175
listbox ложное действие

listbox ложное действие

При нажатии на элемент listboxа открывается новая форма, но также это происходит(ложное срабатывание) после заполнение listboxа командой listBox4DataSource...

165
Ошибка при создании скрипта

Ошибка при создании скрипта

При создании нового скрипта юнити пишет "No MonoBehaivour scripts in the file, or their names do not match the file name"

176
Как вывести хэш таблицу имеющую один ключ и несколько значений?

Как вывести хэш таблицу имеющую один ключ и несколько значений?

После этого вопроса, сразу возник следующийЕсли в хеш-таблице ключ имеет несколько значений, то как их все сразу вывести?

231