Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从内部操纵集合_C#_.net_Winforms - Fatal编程技术网

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);
}