Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# InvalidArgument=的值';0';对';无效;已选择索引';。参数名称:SelectedIndex_C#_.net_Xml_Winforms - Fatal编程技术网

C# InvalidArgument=的值';0';对';无效;已选择索引';。参数名称:SelectedIndex

C# InvalidArgument=的值';0';对';无效;已选择索引';。参数名称:SelectedIndex,c#,.net,xml,winforms,C#,.net,Xml,Winforms,我在尝试此代码时遇到上述错误。我试着给予,但没有用。(这是默认的) 错误出现在cmbProduct\u SelectedIndexChanged事件中 cmbProduct --> combobox cmbBrand --> combobox 全球 DataSet dsUpdate = new DataSet(); 表单加载 dsUpdate.ReadXml(@"...\..\stock.xml");

我在尝试此代码时遇到上述错误。我试着给予,但没有用。(这是默认的)

错误出现在
cmbProduct\u 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;
        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*/  
CMB产品\u选择的索引已更改

        dsUpdate.ReadXml(@"...\..\stock.xml");
        cmbProduct.DataSource = dsUpdate.Tables[0]
            .DefaultView.ToTable(true, "productname");//.DefaultView;
        cmbProduct.DisplayMember = "productname";
        cmbProduct.SelectedIndex = 0;
        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*/  
请帮忙
提前感谢。

问题是:

启动应用程序时,CMBRAND中没有项目,但cmbProduct FIELS SELECTED DEXCHANGED

试试这个:

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

this.cmbProduct.SelectedIndexChanged += new System.EventHandler(this.cmbProduct_SelectedIndexChanged);
之后,当您使用xml文件中的数据填充数据集时,初始化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;

你也可以试试这个。在设置combobox数据源之前,请设置其BindingContext

cmbProduct.BindingContext = this.BindingContext;

我也犯了同样的错误。我认为这个错误是有原因的。 因此,我的错误与“另一个线程中的set
DataSource
不工作”有关

范例

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

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

如果您有此问题:

  • 使用Form_Activated事件处理程序控制索引设置
  • 对我来说,我在表单中添加了一系列动态生成的组合框
  • 我列出了一个我想使用SetIndex=0的列表,然后在这个处理程序中迭代它们
  • 我还有一个布尔值,firstFormActivation,当只调用一次SetIndex时
  • 顺便说一句,您也可以对Focus()使用此方法,因此动态添加表单中的第一个字段时会获得焦点
下面是一些代码来说明这一点:

    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;
                }
            }
        }
private readonly List combosToSetIndexOn=new List();
private bool firstActivation=true;
私有控件firstWindowsControl=null;
...
//其他代码集控件。。。
私有void DynamicForm_已激活(对象发送方、事件参数e)
{
如果(首次激活)
{
firstActivation=false;
bool fwcPresent=(firstWindowsControl!=null);
WriteLine($“DynamicForm_已激活:firstWindowControl存在:{fwcPresent}”);
如果(fwcPresent)
{
firstWindowsControl.Focus();
}
如果(combosToSetIndexOn.Count>0)
{
foreach(combosToSetIndexOn中的ComboBox c)
{
WriteLine($“DynamicForm_激活:处理:{c.Name}”);
c、 SelectedIndex=0;
}
}
}

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


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

CMBRAND中确实有soem条目吗?您还可以确认CMBRAND是什么对象类型吗?是的,它有条目。当我没有给出
CMBRAND.SelectedIndex=0;
cmbProduct\u SelectedIndexChanged
时,它会显示条目。但为了使它不首先显示空值,我添加了
cmbBr和.SelectedIndex=0;
。它给出了错误。当我将鼠标悬停在
CMBRAND.SelectedIndex=0;
上时,它表示它持有
-1
,但正如您在我的xml文件中看到的,它有值,而且当我运行时没有给出
CMBRAND.SelectedIndex=0;
,我的表单在CMBRAND中显示值,当然它没有d
-1
。这是我无法理解的。是的,这起作用了。我一直在想,在函数开始的时候,form_load事件会首先触发:)。谢谢。aaa这在表单加载时并没有显示任何内容。你知道为什么吗?你需要指定在CMBRAND中显示什么。你只需填充CMBRAND即可uct加载时我需要手动更改
cmbProduct
的值,以便
cmbBrand
显示值。相反,
cmbBrand
应仅显示与
cmbProduct
加载时所选值相关的一些值。