Когда закрываю форму легко получаю значение 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
}
}
Читайте документацию (можно прямо в Студии навести мышку на свойство и всплывет подсказка с описанием).
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.
Вот такой класс будет элементом в коллекции комбобокса
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());
}
}
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости