InvalidArgument =值'0'对'SelectedIndex'无效。参数名称:SelectedIndex

时间:2012-10-11 12:23:11

标签: c# .net xml winforms

我在尝试此代码时遇到上述错误。我尝试过just my code但没有用。 (这是默认的)

Here is my XML file

错误发生在cmbProduct_SelectedIndexChanged事件中。

        cmbProduct --> combobox
        cmbBrand   --> combobox

全球

        DataSet dsUpdate = new DataSet();

Form_load中

        dsUpdate.ReadXml(@"...\..\stock.xml");
        cmbProduct.DataSource = dsUpdate.Tables[0]
            .DefaultView.ToTable(true, "productname");//.DefaultView;
        cmbProduct.DisplayMember = "productname";
        cmbProduct.SelectedIndex = 0;

cmbProduct_SelectedIndexChanged

        cmbBrand.Items.Clear();
        foreach (DataRow Row in dsUpdate.Tables[0].Select("productname='" + cmbProduct.Text + "'"))
        {
            //cmbBrand.SelectedIndex = i;
            cmbBrand.Items.Add(Row["brandname"].ToString());
            //i++;
        } 
        cmbBrand.SelectedIndex = 0; /*ERROR*/  

请帮忙
提前致谢。

5 个答案:

答案 0 :(得分:5)

问题是:

启动应用程序时,cmbBrand中没有项目,但cmbProduct会触发SelectedIndexChanged。

试试这个:

从Form1.Designer.cs中删除SelectedIndexChanged事件初始化。尝试找到以下行:

this.cmbProduct.SelectedIndexChanged += new System.EventHandler(this.cmbProduct_SelectedIndexChanged);

之后,当您使用xml文件中的数据填充DataSet时,初始化SelectedIndexChanged事件:

dsUpdate.ReadXml(@"...\..\stock.xml");
cmbProduct.DataSource = dsUpdate.Tables[0].DefaultView.ToTable(true, "productname");//.DefaultView;
cmbProduct.DisplayMember = "productname";
this.cmbProduct.SelectedIndexChanged += new System.EventHandler(this.cmbProduct_SelectedIndexChanged);
cmbProduct.SelectedIndex = 0;

答案 1 :(得分:1)

您也可以试试这个。在设置组合框之前,DataSource设置其BindingContext

cmbProduct.BindingContext = this.BindingContext;

答案 2 :(得分:0)

我有同样的错误。我认为这个错误有一些原因。 所以我的错误与"在另一个线程中设置DataSource不起作用"

例如

//Run in another thread
myComboBox.DataSource = myDataSource; //not set

修复

myComboBox.Invoke(new Action(() => myComboBox.DataSource = myDataSource));

答案 3 :(得分:0)

如果您遇到此问题:

  • 使用 Form_Activated 事件处理程序来控制索引的设置。
  • 对我来说,我添加了一系列动态生成的ComboBox,并将其添加到窗体中。
  • 我列出了要使用SetIndex = 0的列表,然后在此处理程序中对其进行遍历。
  • 当只一次调用SetIndex时,我还有一个布尔值firstFormActivation。
  • 您也可以对Focus()顺便使用此方法,以便动态添加时Form的第一个字段成为焦点。

下面是一些代码来说明这一点:

    private readonly List<ComboBox> combosToSetIndexOn = new List<ComboBox>();
    private bool firstActivation = true;
    private Control firstWindowsControl = null;

    ...
    // Other code sets firstWindowsControl...

    private void DynamicForm_Activated(object sender, EventArgs e)
    {
        if (firstActivation)
        {
            firstActivation = false;
            bool fwcPresent = (firstWindowsControl != null);
            Console.WriteLine($"DynamicForm_Activated: firstWindowControl present: {fwcPresent}");
            if (fwcPresent)
            {
                firstWindowsControl.Focus();
            }

            if (combosToSetIndexOn.Count > 0)
            {
                foreach (ComboBox c in combosToSetIndexOn)
                {
                    Console.WriteLine($"DynamicForm_Activated: processing: {c.Name}");
                    c.SelectedIndex = 0;
                }
            }
        }

答案 4 :(得分:0)

如果在没有有效数据源的情况下尝试设置SelectedIndex,则会发生这种情况。如果将默认值重置为0,并偶尔更改数据源列表,则可能会看到此信息。如果应用新的数据源,则无需默认为0,因此简单的检查将避免发生这种情况:

如果(comboBox.Datasource!= null)comboBox.SelectedIndex = 0;