У меня есть класс, содержащий свойство, которое является перечислением:
public RaTypes RaBucket1Type { get; set; }
Мое перечисление:
public enum RaTypes
{
Red,
Yellow
}
Мне удалось привязать источник данных combobox формы к перечислению, чтобы, когда я нажимаю на раскрывающийся список, я вижу перечисления:
cmbBucket1Type.DataSource = Enum.GetValues(typeof(RaTypes));
Когда я загружаю форму, я хочу заполнить поле со списком существующим значением. Я пробовал следующее:
cmbBucket1Type.DisplayMember = "TradeType";
cmbBucket1Type.ValueMember = "TradeEnumID";
cmbBucket1Type.SelectedValue = EditedAlgorithm.RaBucket1Type;
Но это не сработало.
Кроме того, я не уверен, что правильно реализовал обработчик событий ValueChanged:
EditedAlgorithm.RaBucket1Type = (RaTypes)((ComboBox)sender).SelectedItem;
Может кто-нибудь помочь мне понять:
Спасибо - Ред.
ОБНОВЛЕНИЯ я пытался
cmbBucket1Type.SelectedIndex = cmbBucket1Type.FindString(EditedAlgorithm.RaBucket1Type.ToString());
а также
cmbBucket1Type.SelectedItem = EditedAlgorithm.RaBucket1Type;
Ни то, ни другое не работает.
Вопрос Когда я загружаю форму, я хочу заполнить поле со списком существующим значением. не имеет большого смысла. В ComboBox мир заселять означает добавить предметы для ComboBox. Вы пытаетесь выбрать последнее значение, отображаемое во время загрузки?
Я бы хотел: при загрузке формы добавить значение существующего свойства класса. Когда пользователь щелкает стрелку вниз, предлагаются (отображаются) все значения перечисления.
Да, форма Windows.





Вы можете установить selectedValue следующим образом:
cmbBucket1Type.SelectedValue = EditedAlgorithm.RaBucket1Type;
И вы можете обработать выбранное значение, когда комбо изменится следующим образом:
private void cmbBucket1Type_SelectedValueChanged(object sender, EventArgs e)
{
var selectedValue = cmbBucket1Type.SelectedValue;
}
Спасибо за ответ, но я не вижу разницы между вашим предложением и тем, что я сказал. Я пробовал и не работал? "cmbBucket1Type.SelectedValue = EditedAlgorithm.RaBucket1Type;" это именно то, что я пробовал ... Есть ли опечатка ??
Я думаю, что вы используете терминологию немного иначе, чем обычно, что затрудняет понимание.
Обычно термины Добавлять, Заселить и Выбирать используются для обозначения следующего:
Разобравшись с этим, я предполагаю, что вы хотите сделать следующее.
ComboBox с набором значений. В вашем случае значения RaTypeEnum.SomeClass.RaBucket1Type указанного экземпляра класса с выбранным вами значением enum. Я инициализирую его на Yellow.ComboBoxВыбрать указанное значение при запуске.Form_Load, в любой момент времени, если пользователь изменяет значение ComboBox, это изменение будет отражено в свойстве экземпляра класса.Для этого я бы сделал что-то вроде этого:
public partial class MainForm : Form
{
// Your class instance.
private SomeClass InstanceOfSomeClass = null;
public MainForm()
{
InitializeComponent();
// Initialize the RaBucket1Type property with Yellow.
InstanceOfSomeClass = new SomeClass(RaTypes.Yellow);
// Populating the ComboBox
comboBox1.DataSource = Enum.GetValues(typeof(RaTypes));
}
// At selected index changed event
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
// Get the selected value.
var selected = comboBox1.SelectedValue;
// Change the `RaBucket1Type` value of the class instance according to the user choice.
InstanceOfSomeClass.RaBucket1Type = (RaTypes)selected;
}
private void MainForm_Load(object sender, EventArgs e)
{
// At form load time, set the `SelectedItem` of the `ComboBox` to the value of `RaBucket1Type` of your class instance.
// Since we initialized it to `Yellow`, the `ComboBox` will show `Yellow` as the selected item at load time.
if (InstanceOfSomeClass != null)
{
comboBox1.SelectedItem = InstanceOfSomeClass.RaBucket1Type;
}
}
}
public enum RaTypes
{
Red,
Yellow
}
public class SomeClass
{
public RaTypes RaBucket1Type { get; set; }
public SomeClass(RaTypes raTypes) { RaBucket1Type = raTypes; }
}
Имейте в виду, что это базовый пример, показывающий, как справиться с ситуацией, а не полный законченный код. Вам нужно будет выполнить несколько проверок ошибок, чтобы убедиться, что экземпляры классов и выбранные элементы не равны нулю и т. д.
СПАСИБО! ... Я действительно пробовал это (SelectedItem = ...), но по какой-то причине это не работает. Я сделаю еще немного отладки и опубликую то, что найду (надеюсь, ответ). ОЧЕНЬ странный аспект, который я замечаю во время отладки, заключается в том, что когда я заполняю поле со списком, назначая его источник данных (как показано выше), я вижу изменение свойства класса. Очень странное поведение, поскольку эти два понятия не должны быть связаны. Обожаю / ненавижу эти баги :)
НАШЕЛ ОТВЕТ:
У меня было событие SelectedIndexChanged, указывающее на мой обработчик событий, что означает, что когда я «добавлял» элементы в ComboBox, используя:
comboBox1.DataSource = Enum.GetValues(typeof(RaTypes));
он запускал обработчик событий и сбрасывал свойство моего класса. Мой обработчик событий был таким:
var selectedValue = cmbBucket1Type.SelectedValue;
Итак, простое решение заключалось в следующем:
Добавьте следующий обработчик событий в код ПОСЛЕ Я назначаю DataSource
bucketType1.SelectedIndexChanged + = BucketTypeChanged;
Это сработало.
СПАСИБО ВСЕМ ЗА ПОМОЩЬ !!
- Ред.
Это ведь Windows Forms, верно?