2016-01-22 100 views
0

我有一个列表框,带有2个按钮,新建和删除。新增项目到列表框中,删除按钮应该从列表框中删除项目。列表框项目与从下面的文本框中存储用户输入数据的类绑定。列表框删除

private void AddListBox() 
    {   
     lstCondition.BeginUpdate(); 
     Condition cond = new Condition(""); 

     cond.Name = string.Format("Condition {0}", _selection.NetConditions.Count + 1); 
     _selection.NetConditions.Add(cond); 

     lstCondition.EndUpdate(); 

     lstCondition.SelectedItem = cond;      

     cboNetCondition.Properties.Items.Clear(); 
     cboNetCondition.Properties.Items.AddRange(NetCondition); 
     cboControlType.Properties.Items.Clear(); 
     cboControlType.Properties.Items.AddRange(ControlType); 
     cboFlowRate.Properties.Items.Clear(); 
     cboFlowRate.Properties.Items.AddRange(FlowRate); 
    } 

private void btnNew_Click(object sender, EventArgs e) 
     { 
      AddListBox(); 

     } 

cbo项目是组合框,其数据在条件类中绑定到列表框的每个实例。

public frmNetConditions(Condition condo, Selection selection) 
    { 
     InitializeComponent(); 
     _selection = selection; 
     lstCondition.DataSource = _selection.NetConditions; 
     condition = _selection.NetConditions.Count; 

    } 

private void btnDelete_Click(object sender, EventArgs e) 
    { 

     selectedCondition = (Condition)lstCondition.SelectedItem; 

     cboControlType.SelectedIndex = -1; 
     cboNetCondition.SelectedIndex = -1; 
     cboFlowRate.SelectedIndex = -1; 
     txtFlowRate.Text = string.Empty; 
     txtStatPressure.Text = string.Empty; 
     txtDampOpening.Text = string.Empty; 
     txtDensity.Text = string.Empty; 
     cboDensity.SelectedIndex = -1; 

     lstCondition.Items.Remove(lstCondition.SelectedItem); 
     lstCondition.Refresh(); 


    } 

按下这个删除按钮后,列表框仍然包含我想删除的项目,我不确定这是为什么?

更新与数据源

public List<Condition> NetConditions { get { return _netconditions; } } 
+1

你可以发布与你的列表框相关的整个代码吗? – Alexei

+0

你是否将你的列表绑定到列表或类似的东西? – Alexei

+0

'lstCondition'似乎不会填充,但您尝试分配其SelectedItem。 – Alexei

回答

0

正如已经建议,你应该绑定到一个BindingList<Condition>而不是List<Condition>。这使您可以更改数据源和控件(ListBox)以获取更改通知。该代码应该是这样的:

lstCondition.ValueMember = "ConditionId"; 
lstCondition.DisplayMember = "Name"; 
lstCondition.DataSource = NetConditions; 

定义绑定后,在ListBox项目操作的正确方法是从datasource,而不是ListBox本身删除:

// SelectedItem should be checked for null (no selection is an option) 
NetCondition.Remove((Condition)lstCondition.SelectedItem); 

但是,如果,你打算改变一个元素的属性(所以,而不是列表本身),只有当你的元素(条件)实现了INotifyPropertyChanged接口时才会通知控件。

+0

好吧,所以它不可能做,而其列表,而不是一个绑定列表 – user5504777

+0

我认为这是最方便的方式来做到这一点。 [BindingList ](https://msdn.microsoft.com/en-us/library/ms132679(v = vs.110).aspx)只是一个用于绑定场景的增强通用列表,就像您在这里一样。 – Alexei

+0

作品像魅力谢谢 – user5504777