簡體   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