我在一個類中創建了一個組合框,並且想要爲該組合框設置選定的值。但是當我這樣做時,selectedValue保持爲空,當我嘗試設置selectedIndex時,我得到一個ArgumentOutOfRangeException。C#爲什麼不能設置動態創建的組合框的selectedValue?
代碼:
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;
}
我希望有人能向我解釋發生了什麼,所以我能理解爲什麼它不工作。
這是一個完整的小程序,說明了我的問題。正如你可以看到它不設置的SelectedValue,這保持空
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; }
}
}
}
我的組合它是ValueMember是Id類型的long類型。您提到的AnswerId也是long類型的。我看起來組合還沒有'綁定'數據源。因爲當我在實際表單上設置selectedValue時,它可以工作。問題是,我無法在類中設置SelectedValue,但我可以將其設置在控件佔據他的位置的表單上。 – Martijn 2010-07-08 07:23:15
@Martijn:如果你可以添加一個簡短的*完整的*程序,這對我們自己來說是非常有用的。它不需要很複雜 - 但目前我們只是猜測。 – 2010-07-08 07:30:21
@Jon:我用一個完整的程序編輯了我的startpost,說明了我的情況。 – Martijn 2010-07-08 07:55:27