如何判断元素是否已存在于FlowLayoutPanel中并避免重复创建?
解决FlowLayoutPanel重复创建用户按钮的问题
你可以通过检查FlowLayoutPanel中已存在的Button控件,仅添加不存在的用户按钮,实现每个元素唯一的需求。修改后的代码如下:
foreach (Data a in AllData) { if (a != null && !string.IsNullOrEmpty(a.User)) { // 检查是否已存在对应用户的按钮 bool exists = flowLayoutPanelUser.Controls.Cast<Button>() .Any(btn => btn.Text == a.User); if (!exists) { Button buttonHome = new Button(); buttonHome.Text = a.User; buttonHome.Tag = a.User; buttonHome.Click += OpenUser_Click; flowLayoutPanelUser.Controls.Add(buttonHome); } } }
关键说明:
- 移除了原代码中的
flowLayoutPanelUser.Controls.Clear();,保留已有不重复的按钮,只新增不存在的项 - 用
Cast<Button>()将Control集合转换为Button类型集合,方便直接判断按钮的Text属性 - 通过
Any()方法快速校验是否存在目标按钮,避免重复创建 - 额外增加
!string.IsNullOrEmpty(a.User)判断,防止生成空文本的无效按钮
如果你的AllData数据源本身存在重复的用户项,还可以先对数据源去重,减少不必要的控件检查:
// 先按User字段对数据源去重 var uniqueData = AllData.Where(a => a != null && !string.IsNullOrEmpty(a.User)) .DistinctBy(a => a.User); foreach (Data a in uniqueData) { bool exists = flowLayoutPanelUser.Controls.Cast<Button>() .Any(btn => btn.Text == a.User); if (!exists) { Button buttonHome = new Button(); buttonHome.Text = a.User; buttonHome.Tag = a.User; buttonHome.Click += OpenUser_Click; flowLayoutPanelUser.Controls.Add(buttonHome); } }
内容的提问来源于stack exchange,提问作者Laurin Theisen
相关产品推荐
相关产品推荐

