繁体   English   中英

InvalidArgument=“0”的值对“SelectedIndex”无效。 参数名称:SelectedIndex

[英]InvalidArgument=Value of '0' is not valid for 'SelectedIndex'. Parameter name: SelectedIndex

尝试此代码时出现上述错误。 我试着 只给出我的代码但没有用。 (这是默认的)

这是我的 XML 文件

错误出现在cmbProduct_SelectedIndexChanged事件中。

        cmbProduct --> combobox
        cmbBrand   --> combobox

全球的

        DataSet dsUpdate = new DataSet();

表单加载

        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 中没有项目,但 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;

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

例子

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

修复

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

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

cmbProduct.BindingContext = this.BindingContext;

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

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

如果你有这个问题:

  • 使用Form_Activated事件处理程序来控制设置索引。
  • 对我来说,我将一系列动态生成的组合框添加到表单中。
  • 我列出了我想使用 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;
                }
            }
        }

在我的情况下,以下是我的问题

myComboBox.DataSource = myBindingSource
myBindingSource.DataSource = items.ToList()  // error

以下工作

myComboBox.DataSource = null;
myBindingSource.DataSource = items.ToList();
MyComboBox.DataSource = myBindingSource;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM