【问题标题】:InvalidArgument=Value of '0' is not valid for 'SelectedIndex'. Parameter name: SelectedIndexInvalidArgument=“0”的值对“SelectedIndex”无效。参数名称:SelectedIndex
【发布时间】:2012-10-11 12:23:10
【问题描述】:

我在尝试此代码时遇到上述错误。我尝试给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*/  

请帮忙
提前致谢。

【问题讨论】:

  • cmbBrand 里面肯定有一些条目吗?您还可以确认 cmbBrand 是什么对象类型吗?
  • 是的,它有条目。当我没有在cmbProduct_SelectedIndexChanged 中给出cmbBrand.SelectedIndex = 0; 时,它会显示条目。但为了让它一开始不显示空值,我添加了cmbBrand.SelectedIndex = 0;。它给出了错误。

标签: c# .net xml winforms


【解决方案1】:

问题是:

当您启动应用程序时,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;

【讨论】:

  • 当我将鼠标悬停在 cmbBrand.SelectedIndex = 0; 上时,它表示它拥有 -1 但正如您在我的 xml 文件中看到的那样,它具有值,而且当我在不提供 cmbBrand.SelectedIndex = 0; 的情况下运行时,我的在 cmbBrand 中显示值的表单,当然它不包含-1。这是我无法理解的。
  • 是的,这行得通。我一直在想 form_load 事件会在函数开始时首先触发:)。谢谢。
  • aaa 最初加载表单时 cmbBrand 中没有显示任何内容。你知道为什么会这样吗?
  • 您需要指定在 cmbBrand 中显示的内容。您只需在加载时填充 cmbProduct
  • 我需要手动更改cmbProduct 的值,以让cmbBrand 显示这些值。而cmbBrand 应该仅在加载时显示与cmbProduct 中的选定值相关的一些值。
【解决方案2】:

你也可以试试这个。在设置组合框 DataSource 之前设置它的 BindingContext

cmbProduct.BindingContext = this.BindingContext;

【讨论】:

    【解决方案3】:

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

    例子

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

    修复

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

    【讨论】:

      【解决方案4】:

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

      if (comboBox.Datasource != null) comboBox.SelectedIndex = 0;

      【讨论】:

        【解决方案5】:

        如果你有这个问题:

        • 使用 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;
                        }
                    }
                }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多