删除组合框中的所选项目

时间:2015-02-09 07:44:40

标签: c# combobox

我想删除组合框中的选定项目

我在这里有一个代码加载表单,我正在从数据库填充组合框中的列表项。

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)
            {

            }

但是它抛出了一个异常,说在设置数据源属性时无法修改&#34; items集合。&#34;我不知道如何修复此异常错误,我认为这是我在组合框中删除项目时唯一的问题。

请帮我解决这个问题。提前谢谢!

2 个答案:

答案 0 :(得分:0)

使用BindingSource DataSourceCurrentItemChanged对CBO中已更改的项目作出反应:

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

答案 1 :(得分:0)

Items集合来自/绑定到DataSource时,您无法对其进行修改。相反,您需要修改DataSource本身。

要从SelectedItem删除DataSource,您可以尝试:

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