C# 从内部操纵集合
我有一个面板的集合,当用户点击它们时,这些面板会高亮显示。我想强制它们表现为一组单选按钮,以便只突出显示单击的一个按钮,而其他按钮不突出显示C# 从内部操纵集合,c#,.net,winforms,C#,.net,Winforms,我有一个面板的集合,当用户点击它们时,这些面板会高亮显示。我想强制它们表现为一组单选按钮,以便只突出显示单击的一个按钮,而其他按钮不突出显示 我想一定有办法从内部操纵整个集合(将属性设置为false),因为事件是由集合中的一项触发的。一个项目是否有办法操纵整个集合?这是应用程序中的一个常见特性,所以我想一定有一种模式可以正确地实现它。谢谢。您可以存储面板集合,并按照以下代码片段处理所需功能: List<Panel> Panels; private void Initializatio
我想一定有办法从内部操纵整个集合(将属性设置为false),因为事件是由集合中的一项触发的。一个项目是否有办法操纵整个集合?这是应用程序中的一个常见特性,所以我想一定有一种模式可以正确地实现它。谢谢。您可以存储面板集合,并按照以下代码片段处理所需功能:
List<Panel> Panels;
private void Initialization()
{
Panels = new List<Panel>();
Panels.Add(pnl1);
Panels.Add(pnl2);
//add all your panels into collection
foreach(Panel Item in this.Panels)
{
//add handle to panel on click event
Item.Click += OnPanelClick;
}
}
private void OnPanelClick(object sender, EventArgs e)
{
foreach(Panel Item in this.Panels)
{
//remove highlight from your panels, real property should have other name than Panel.HighlightEnabled
Item.HighlightEnabled = false;
}
((Panel)sender).HighlightEnabled = true; //add highlight to Panel which invoked Click event
Application.DoEvents(); //ensure that graphics redraw is completed immediately
}
private void AddNewPanelIntoLocalCollection(Panel panel)
{
//here you can add new items to collection during program lifecycle
panel.Click += OnPanelClick;
this.Panels.Add(panel);
}
列表面板;
私有void初始化()
{
面板=新列表();
面板。添加(pnl1);
面板。添加(pnl2);
//将所有面板添加到集合中
foreach(此.Panels中的面板项目)
{
//单击事件时将句柄添加到面板
Item.Click+=OnPanelClick;
}
}
PanelClick上的私有void(对象发送者,事件参数e)
{
foreach(此.Panels中的面板项目)
{
//从面板中删除突出显示,不动产应具有Panel.Highlightabled以外的其他名称
Item.highlightabled=假;
}
((Panel)sender).highlightabled=true;//向调用单击事件的面板添加高亮显示
Application.DoEvents();//确保立即完成图形重画
}
私有void AddNewPanelIntoLocalCollection(面板)
{
//在这里,您可以在程序生命周期中将新项目添加到集合中
panel.Click+=OnPanelClick;
此.Panels.Add(面板);
}
我就是这样做的
public class SelectOne : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
private bool isSelected = false;
private HashSet<SelectOne> selecteOnes = null;
public bool IsSelected
{
get { return isSelected; }
set
{
if (isSelected == value) return;
if (isSelected && selecteOnes != null)
{
foreach (SelectOne so in selecteOnes)
{
if (so == this) continue;
so.IsSelected = false;
}
}
NotifyPropertyChanged("IsSelected");
}
}
public SelectOne() { }
public SelectOne(bool IsSelected) { isSelected = IsSelected; }
public SelectedOne(bool IsSelected, HashSet<SelectOne> SelecteOnes)
{
isSelected = IsSelected;
selecteOnes = SelecteOnes;
}
}
公共类SelectOne:INotifyPropertyChanged
{
公共事件属性更改事件处理程序属性更改;
受保护的void NotifyPropertyChanged(字符串信息)
{
if(PropertyChanged!=null)
{
PropertyChanged(此,新PropertyChangedEventArgs(信息));
}
}
private bool isSelected=假;
私有HashSet selecteOnes=null;
公选学校
{
获取{return isSelected;}
设置
{
如果(isSelected==值)返回;
if(isSelected&&selecteOnes!=null)
{
foreach(在selecteOnes中选择一个so)
{
如果(so==这个)继续;
so.IsSelected=false;
}
}
NotifyPropertyChanged(“IsSelected”);
}
}
public SelectOne(){}
public SelectOne(bool IsSelected){IsSelected=IsSelected;}
public SelectedOne(bool是selected,HashSet SelectedOne)
{
isSelected=isSelected;
selecteOnes=selecteOnes;
}
}
最终,我找到了一种方法,只需一个代理就可以正确地完成这项任务
在类A中,我有一组对象B
List<B> b = new List<B>
A类有这样一种方法:
public void RemoveItem(int id)
{
for (int x = 0; x < b.Count; x++)
{
if (b[x].id == id)
{
b.RemoveAt(x);
}
}
}
现在您需要做的就是在B类中添加deleteMetod
void DeleteMe()
{
// and call local delegate - pointing to metod which actually can manipulate the collection
deleteThis(id);
}
如果您谈论的是从其他复选框的事件切换复选框,正确的方法是包含控件订阅每个复选框上的事件,并从中操作其他复选框。今天早些时候,我有一个与
RadioButton
类似的问题,您可以将其转换为您的需求。看看这是否有帮助。
B bObject = new B();
bObject.deleteThis = RemoveItem;
b.Add(bObject);
void DeleteMe()
{
// and call local delegate - pointing to metod which actually can manipulate the collection
deleteThis(id);
}