6

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

这是我的 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*/  

请帮助
提前致谢。

4

5 回答 5

6

问题是:

当您启动应用程序时,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;
于 2012-10-11T12:37:45.973 回答
1

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

cmbProduct.BindingContext = this.BindingContext;
于 2016-03-17T06:51:17.467 回答
1

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

例子

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

修复

myComboBox.Invoke(new Action(() => myComboBox.DataSource = myDataSource));
于 2018-02-23T08:26:43.177 回答
1

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

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

于 2020-11-03T06:01:45.093 回答
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;
                }
            }
        }
于 2019-07-05T13:20:06.440 回答