C# 为什么不能设置动态创建的组合框的 selectedValue? [英] C# Why isn't it possible to set the selectedValue of a dynamically created combobox?

查看:20
本文介绍了C# 为什么不能设置动态创建的组合框的 selectedValue?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在类中创建了一个组合框,并想为该组合框设置选定的值.但是当我这样做时, selectedValue 保持为空,当我尝试设置 selectedIndex 时,我得到一个 ArgumentOutOfRangeException.

I create a combobox in a class and want to set the selected value for that combobox. But when I do that, the selectedValue stays null and when I try to set the selectedIndex I get a ArgumentOutOfRangeException.

代码:

public Control GenerateList(Question question)
{
    // Clear the local givenAnswer collection
    _givenAnswer.Clear();

    // Get a list with answer possibilities
    List<QuestionAnswer> answers = question.GetAnswerSort();

    // Get a collection of given answers
    Collection<QuestionnaireAnswer> givenAnswers = question.GetGivenAnswers();

    _givenAnswer = givenAnswers;

    ComboBox cmb = new ComboBox();
    cmb.Name = "cmb";
    cmb.DisplayMember = "Answer";
    cmb.ValueMember = "Id";
    cmb.DataSource = answers;
    cmb.Dock = DockStyle.Top;

    // Check an answer is given to the question
    if (givenAnswers != null && givenAnswers.Count > 0)
    {
        cmb.Tag = givenAnswers[0].AnswerId;
        cmb.SelectedValue = givenAnswers[0].AnswerId; // answerId = 55, but SelectedValue stays null
    }

    cmb.SelectedIndex = 1; // For testting. This will throw a ArgumentOutOfRangeException
    cmb.DropDownStyle = ComboBoxStyle.DropDownList;
    cmb.SelectedIndexChanged += new EventHandler(cmb_SelectedIndexChanged);

    return cmb;
}

我希望有人能向我解释发生了什么,以便我理解为什么它不起作用.

I hope someone can explain to me what is happening so I can understand why it isn't working.

这是一个完整的小程序,可以说明我的问题.正如你所看到的,它没有设置 SelectedValue,它保持为 null

Here is a complete little program what illustrates my problem. As you can see it doesn't set the SelectedValue, this stays null

namespace Dynamic_Create_Combo
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            GenerateControls gc = new GenerateControls();
            Control c = gc.GenerateCombo();

            this.SuspendLayout();
            this.Controls.Add(c);
            this.ResumeLayout(true);
        }
    }

    public class GenerateControls
    {
        public Control GenerateCombo()
        {
            // Create datasource
            Collection<Car> cars = new Collection<Car>();
            Car c = new Car();
            c.Id = 1;
            c.Name = "Car one";
            cars.Add(c);

            Car c1 = new Car();
            c1.Id = 2;
            c1.Name = "Car two";
            cars.Add(c1);

            Car c2 = new Car();
            c2.Id = 2;
            c2.Name = "Car three";
            cars.Add(c2);

            ComboBox cmb = new ComboBox();
            cmb.DropDownStyle = ComboBoxStyle.DropDownList;
            cmb.DataSource = cars;
            cmb.DisplayMember = "Name";
            cmb.ValueMember = "Id";

            cmb.SelectedValue = 2;

            return cmb;
        }
    }

    public class Car
    {
        private int _id;
        private string _name;

        public int Id
        {
            get { return _id; }
            set { _id = value; }
        }

        public string Name 
        {
            get { return _name; }
            set { _name = value; }
        }
    }
}

推荐答案

您已将值成员设置为Id",但您正尝试使用AnswerId"作为所选值.

You've set the value member to be "Id" but you're trying to use "AnswerId" as the selected value.

没有更多细节,很难说为什么设置 SelectedIndex 会抛出 ArgumentOutOfRangeException - 也许组合框忽略了所有没有Id"属性的值,因此没有给你任何值,所以选择索引 1 是不可能的?

Without more details, it's hard to say why setting SelectedIndex is throwing an ArgumentOutOfRangeException - perhaps the combobox is ignoring all values which don't have an "Id" property, thus giving you no values, so selecting index 1 is impossible?

好的,所以看起来它只是在它变得可见时才真正进行绑定 - 或者在过程的某个阶段.我已经尝试了一些方法来加速这一过程,但它们似乎没有帮助.您可以做的是推迟您的选择:

Okay, so it looks like it's only actually doing the binding when it becomes visible - or at some stage in the process. I've tried a few things to accelerate this, but they don't appear to help. What you can do is defer your selection:

EventHandler visibleChangedHandler = null;
visibleChangedHandler = delegate {
    cmb.SelectedIndex = 2;
    cmb.VisibleChanged -= visibleChangedHandler; // Only do this once!
};
cmb.VisibleChanged += visibleChangedHandler;

这是一个丑陋的解决方法,但它至少应该可以帮助您暂时开始.

It's an ugly workaround, but it should at least help you to get going for the moment.

这篇关于C# 为什么不能设置动态创建的组合框的 selectedValue?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆