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

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

问题描述

我创建一个类组合框,并要设置为组合框选择的值。但是,当我这样做,保持了selectedValue为null,并且当我尝试设置selectedIndex我得到一个ArgumentOutOfRangeException。



代码:

 公共控制GenerateList(问问题)
{
//清除本地givenAnswer收集
_givenAnswer.Clear();

//获取与答案的可能性
名单℃的列表,问题答案>答案= question.GetAnswerSort();

//获取给出答案
收集℃的集合; QuestionnaireAnswer> givenAnswers = question.GetGivenAnswers();

_givenAnswer = givenAnswers;

组合框中巴=新的ComboBox();
cmb.Name =招商银行;
cmb.DisplayMember =答案;
cmb.ValueMember =ID;
cmb.DataSource =答案;
cmb.Dock = DockStyle.Top;

//检查答案是考虑到这个问题
如果(givenAnswers = NULL&放大器;!&安培; givenAnswers.Count大于0)
{
中巴。标签= givenAnswers [0] .AnswerId;
cmb.SelectedValue = givenAnswers [0] .AnswerId; // answerId = 55,但停留的SelectedValue空
}

cmb.SelectedIndex = 1; //对于试井。这将抛出一个ArgumentOutOfRangeException
cmb.DropDownStyle = ComboBoxStyle.DropDownList;
cmb.SelectedIndexChanged + =新的EventHandler(cmb_SelectedIndexChanged);

返回中巴;
}



我希望有人能向我解释发生了什么,所以我能理解为什么它不工作。



下面是一个完整的小程序什么说明我的问题。正如你可以看到它不设置的SelectedValue,这保持空

 命名空间Dynamic_Create_Combo 
{
公共部分Form1类:表格
{
公共Form1中()
{
的InitializeComponent();

GenerateControls GC =新GenerateControls();
控制C = gc.GenerateCombo();

this.SuspendLayout();
this.Controls.Add(三);
this.ResumeLayout(真);
}
}

公共类GenerateControls
{
公共控制GenerateCombo()
{
//创建数据源
收集和LT;汽车>汽车=新的收集和LT;汽车>();
车C =新车();
c.Id = 1;
c.Name =车合一;
cars.Add(三);

型车C1 =新车();
c1.Id = 2;
c1.Name =汽车二;
cars.Add(C1);

型车C2 =新车();
c2.Id = 2;
c2.Name =三厢
cars.Add(C2);

组合框中巴=新的ComboBox();
cmb.DropDownStyle = ComboBoxStyle.DropDownList;
cmb.DataSource =车;
cmb.DisplayMember =姓名;
cmb.ValueMember =ID;

cmb.SelectedValue = 2;

返回中巴;
}
}

公共类汽车
{
私人诠释_id;
私人字符串_name;

公众诠释标识
{
{返回_id; }
集合{_id =价值; }
}

公共字符串名称
{
{返回_name; }
集合{_name =价值; }
}
}
}


解决方案

您已经设置值的成员是ID,但你试图用AnswerId作为选择的值。



如果没有更多的细节,很难说为什么制定的SelectedIndex 抛出一个 ArgumentOutOfRangeException - 也许是组合框忽略这不都值?有一个id属性,从而给你任何值,所以选择指数1是不可能的。



编辑:好了,所以它看起来像它的唯一实际做了绑定时它变得可见 - 或者在该过程的某些阶段。我试了几件事情要加快这一点,但他们似乎并没有帮助。您的什么能的做的是推迟您的选择:

 事件处理visibleChangedHandler = NULL; 
visibleChangedHandler = {委托
cmb.SelectedIndex = 2;
cmb.VisibleChanged - = visibleChangedHandler; //只有做到这一次!
};
cmb.VisibleChanged + = visibleChangedHandler;



这是一个丑陋的解决方法,但它至少应该帮助您获得持续的时刻。


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.

Code:

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.

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; }
        }
    }
}

解决方案

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

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?

EDIT: 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天全站免登陆