2015-02-09 5 views
1

Я хочу, чтобы удалить выбранный элемент в моем комбобоксеУдалить выбранный элемент в поле со списком

меня здесь код при виде нагрузки, я заполнение пунктов списка на выпадающем список из базы данных.

private void LoadComboField() 
    { 
     //string test = "<ROOT><DATA FieldGroup=\"PAYMENT_VIEW4\" FieldDescription=\"PNAME\" Output=\"1\" Filter=\"1\" FieldName=\"PATIENTNAME\" DataType=\"STRING\"/><DATA FieldGroup=\"PAYMENT_VIEW4\" FieldDescription=\"MEMID\" Output=\"1\" Filter=\"1\" FieldName=\"MEMBERID\" DataType=\"STRING\"/></ROOT>"; 
     ReadXMLData(XMLDOC, dsCombo); 
     // ReadXMLData(test, dsCombo); 
     dt = dsCombo.Tables[0]; 
     DataView dv1 = new DataView(dsCombo.Tables[0]); 
     this.cmbField.Items.Clear(); 
     this.cmbField.DataSource = dv1; 
     this.cmbField.DisplayMember = "FieldDescription"; 
     this.cmbField.ValueMember = "FieldName"; 
    } 

Тогда у меня есть этот код на SelectedValueChanged

private void cmbField_SelectedValueChanged(object sender, EventArgs e) 
    { 
     DataGridViewRow GridRowLoc = this.dgvFilter.CurrentRow; 
     AddGrid(iRowIdx); 
     int iRowCount = this.dgvFilter.RowCount - 1; 
     //this.dgvFilter.CurrentRow.IsNewRow 
     //if (GridRowLoc.IsNewRow) continue; 


     // MessageBox.Show(this.dgvFilter.RowCount.ToString()); 
     if (this.cmbField.Text != "System.Data.DataRowView") 
     { 

      this.dgvFilter.Rows[iRowIdx].Cells["ColumnFieldName"].Value = this.cmbField.Text; 
      this.dgvFilter.Rows[iRowIdx].Cells["FieldName"].Value = this.cmbField.SelectedValue; 


      if (iRowCount <= iRowIdx) 
      { 
       DataRow drow = dttable.NewRow(); 
       drow["ColumnNames"] = this.cmbField.Text; 
       drow["FieldName"]= this.cmbField.SelectedValue; 
       drow["Alias"]=string.Empty; 
       drow["DataType"]=string.Empty; 
       drow["Outputs"]=false; 
       drow["SortType"]=string.Empty; 
       drow["SortOrder"]=string.Empty; 
       drow["GroupBy"]=string.Empty; 
       drow["Filter"]=string.Empty; 
       drow["Or1"]=string.Empty; 
       drow["Or2"]=string.Empty; 
       drow["Or3"]=string.Empty; 
       drow["Or4"]=string.Empty; 
       drow["Or5"]=string.Empty; 
       drow["Or6"]=string.Empty; 
       drow["Or7"]=string.Empty; 
       drow["Or8"]=string.Empty; 
       drow["Or9"]=string.Empty; 
       drow["Or10"]=string.Empty; 
       dttable.Rows.Add(drow); 
      } 
      else 
      { 
       int irow = 0; 
       foreach (DataRow dr in dttable.Rows) 
       { 
        if (irow == iRowIdx) 
        { 
         dr["ColumnNames"] = this.cmbField.Text; 
         dr["FieldName"] = this.cmbField.SelectedValue; 
        } 
        irow++;      
       } 
      } 

      CheckAlias(iRowIdx, this.cmbField.Text, dgvFilter); 
      checkcellvalue(this.cmbField.Text, iRowIdx); 
      CheckSorting(); 
      if (bGroupBySelected == true) 
      { 
       this.dgvFilter.Rows[iRowIdx].Cells["GroupBy"].Value = "Group By"; 
      } 

      this.dgvFilter.DataSource = dttable; 
      dsFilter.AcceptChanges(); 

      this.cmbField.Visible = false; 
     } 
     // checkcellvalue(this.cmbField.Text, iRowIdx); 
     //MessageBox.Show(arr_Filter[0]); 

     CheckoutputEnable(); 
    } 

У меня есть этот код в SelectedIndexChanged

try 
      { 
       DataTable dt1 = new DataTable(); 
       DataRowView oDataRowView = cmbField.SelectedItem as DataRowView; 
       string sValue = string.Empty; 

       if (oDataRowView != null) 
       { 
        sValue = oDataRowView.Row["FieldDescription"] as string; 
       } 
       //int count = dttable.Rows.Count - 1; 
       ComboBox comboBox = (ComboBox)sender; 

       // Save the selected employee's name, because we will remove 
       // the employee's name from the list. 
       string selectedEmployee = (string)sValue; 

       int count = 0; 
       int resultIndex = -1; 

       // Call the FindStringExact method to find the first 
       // occurrence in the list. 
       resultIndex = cmbField.FindStringExact(selectedEmployee); 

       // Remove the name as it is found, and increment the found count. 
       // Then call the FindStringExact method again, passing in the 
       // index of the current found item so the search starts there 
       // instead of at the beginning of the list. 
       while (resultIndex != -1) 
       { 
        cmbField.Items.RemoveAt(resultIndex); 
        count += 1; 
        resultIndex = cmbField.FindStringExact(selectedEmployee, 
         resultIndex); 
       } 
       // Update the text in Textbox1. 
       txtName.Text = txtName.Text + "\r\n" + selectedEmployee + ": " 
        + count; 
      } 
       //} 
      catch (Exception ex) 
      { 

      } 

Но он бросает исключение, говорят, что «коллекция элементов не может быть изменена, если свойство datasource установлено. " Я не знаю, как исправить эту ошибку исключения, я думаю, что это моя единственная проблема при удалении элемента в combobox.

Пожалуйста, помогите мне в этом. Заранее спасибо!

+0

Это может помочь вам http://stackoverflow.com/questions/26454622/listbox-error-items-collection-cannot-be- modified-when-the-datasource-property –

+0

Что такое источник данных, вы пытались удалить его оттуда вместо этого? –

+0

@ Pranav-BitWiser Источником данных является DataView dv1 = новый DataView (dsCombo.Tables [0]); при загрузке формы, это находится в вопросе выше внутри private void LoadComboField, если я удалю его, в моем поле со списком не будет элементов. –

ответ

0

Используйте BindingSource для DataSource и CurrentItemChanged реагировать измененных элементов в СВО:

this.source = new BindingSource(); 
this.source.DataSource = loDs.Tables[0]; 
this.cmbField.DataSource = this.source; 
this.source.CurrentItemChanged += source_CurrentItemChanged; 

Пример для EventHandler:

private void source_CurrentItemChanged(object sender, EventArgs e) 
{ 
    System.Data.DataRowView view = this.source.Current as System.Data.DataRowView; 
    if (view != null) 
    { 
     System.Diagnostics.Debug.WriteLine(view[0].ToString()); 
    } 
} 

Вы можете удалить элемент из источника, как это:

this.source.RemoveAt(this.source.Find("FieldName", "PATIENTNAME")); 

Детали: A Detailed Data Binding Tutorial

+0

Что это за источник? –

+0

Я пробовал свой код, но элементы в моей combobox стали System.Data.DataRowView –

+0

this.source является BindingSource. Действительно, combobox itmes - DataRowView. Для добавления, удаления, обновления, фильтрации, сортировки и т. Д. Вы должны использовать только BindingSource ... не элементы в поле со списком. – PinBack

0

Вы не можете изменить коллекцию Items, когда она прибывает/связана с DataSource. Вместо этого вам необходимо изменить сам DataSource.

Чтобы удалить SelectedItem из DataSource вы можете попробовать это:

DataRowView item = cmbField.SelectedItem as DataRowView; 
if (item != null) item.Delete();