关于winfrom控件自动排序(想怎么排就怎么排)

这篇博客探讨了如何在WinForm应用中实现控件的自定义排序,特别是考虑到不同用户角色显示不同控件的情况。作者通过设置控件的TabIndex属性,并创建排序集合,动态调整控件位置来达到所需排序效果。尽管方法可能较为基础,但对于理解控件布局管理有一定帮助。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于winfrom控件自动排序(想怎么排就怎么排)

适用条件:在同一界面,有权限时,管理员登录能看到管理按钮,用户登录隐藏管理按钮,这样那个位置的控件就是空的
大概思路是手动设置控件的tabindex属性,设置参照物控件为1位置固定,为其他的控件跟着顺序命名1,2,3,4,N…,建立集合,遍历需要排序的控件并存放到集合下,再循环遍历出TabIndex的顺序,以参照物控件1为基准,设置除开tabinde1控件的location位置达到排序效果。。。。可能方法有点笨,有简便方法烦请大佬指出,下面排序代码,不喊TABindex设置


```csharp
		 List<Control> c = new List<Control>();  //排序集合
            Point p = btnOperations.Location; //参照物1的位置
            int tabIndex = 0; //最大tabIndex值,所以设置的时候不要乱写,不然要循环很久
            foreach (Control item in panel2.Controls)  // 遍历出需要排序的控件存在集合,因为在panel面板下的,所以是panel2.Controls
            {
                if (item is SimpleButton)
                {
                    if (item.Visible && item.Name != btnOperations.Name)
                    {
                        c.Add(item);
                        if (tabIndex < item.TabIndex)
                        {
                            tabIndex = item.TabIndex;
                        }
                    }
                }
            }

            List<Control> c1 = new List<Control>();  //新建排序后的集合
            while (c.Count() > 0) //循环,条件是需排序集合为空
            {
                for (int i = 1; i <= tabIndex; i++)//根据最大tabindex循环,因为最大值是多少基本就有多少个需要排序,tabindex为1,所有循环因子 i= 1 也是排序的顺序
                {
                    for (int j = 0; j < c.Count(); j++) //遍历需要排序的集合
                    {
                        if (c[j].TabIndex == i) //如果需排序控件tabindex == i   //i=排序的顺序
                        {
                            c1.Add(c[j]); //条件成立 将控件存入新排序后的集合
                            c.Remove(c[j]);//去掉需排序集合的控件,不然要死循环
                            break; //排序了就跳出,免得浪费资源
                        }
                    }
                }
            }

            for (int i = 0; i < c1.Count(); i++) //循环遍历进行定位,之所以不在排序前设置,会让控件无法根据自己想要的位置进行定位
            {
                c1[i].Location = new Point(p.X - c1[i].Width - 10, p.Y); //简单算法,10 = 控件间的间隔,可以根据自己需要进行设置
                p = c1[i].Location;  //定位
            }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值