关于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; //定位
}