您的位置:首页 > 编程语言 > C#

C# 容器上控件排序

2015-06-17 08:22 513 查看
public static class Sort
{

#region 设置PanelControl上按钮显示位置
/// <summary>
/// 设置按钮显示位置
/// </summary>
/// <param name="targetPanel">需要调整按钮顺序的Panel</param>
/// <param name="buttonSpace">按钮间隔</param>
public static void SetButtonCenter(ScrollableControl targetPanel, int buttonSpace)
{
int length = 0;
int maxHeight = 0;
List<Control> listBtn = new List<Control>();
System.Windows.Forms.Control.ControlCollection c = targetPanel.Controls;
foreach (Control btn in c)
{
listBtn.Add(btn);
length += btn.Width + buttonSpace;
if (maxHeight < btn.Height)//获取最大高度
{
maxHeight = btn.Height;
}
}
int pnlLength = targetPanel.Width;
if (length > pnlLength) //本身按钮的长度总和大于了panel的长度,不调整
{
return;
}
int startPos = ((pnlLength - length) / 2);
int yPos = 0;
if (maxHeight < targetPanel.Height)
{
yPos = (targetPanel.Height - maxHeight) / 2;//距离panel上边框的距离
}
else
{
yPos = targetPanel.Height / 10;//距离panel上边框的距离
}
int xPos = startPos;
listBtn.Sort(new ButtonSort());
foreach (Control btn in listBtn)
{
btn.Location = new System.Drawing.Point(xPos, yPos);
xPos += btn.Width + buttonSpace;
}
}
#endregion

#region 设置Control上按钮显示位置
/// <summary>
/// 设置按钮显示位置
/// </summary>
/// <param name="container">需要调整按钮顺序的容器控件</param>
/// <param name="buttonSpace">按钮间隔</param>
public static void SetButtonCenter(Control container, int buttonSpace)
{
int length = 0;
int maxHeight = 0;
List<Control> listControl = new List<Control>();
System.Windows.Forms.Control.ControlCollection c = container.Controls;
foreach (Control btn in c)
{
listControl.Add(btn);
length += btn.Width + buttonSpace;
if (maxHeight < btn.Height)//获取最大高度
{
maxHeight = btn.Height;
}
}
int pnlLength = container.Width;
if (length > pnlLength) //本身按钮的长度总和大于了panel的长度,不调整
{
return;
}
int startPos = ((pnlLength - length) / 2);
int yPos = 0;
if (maxHeight < container.Height)
{
yPos = (container.Height - maxHeight) / 2;//距离panel上边框的距离
}
else
{
yPos = container.Height / 10;//距离panel上边框的距离
}
int xPos = startPos;
listControl.Sort(new ButtonSort());
foreach (Control btn in listControl)
{
btn.Location = new System.Drawing.Point(xPos, yPos);
xPos += btn.Width + buttonSpace;
}
}
#endregion

}


public class ButtonSort : IComparer<Control>
{
#region IComparer<Button> Members
//IComparer<T> 接口:定义类型为比较两个对象而实现的方法。
public int Compare(Control x, Control y)
{
if (x.TabIndex >= y.TabIndex)
{
return 1;
}
else
{
return -1;
}
}
#endregion
}

Sort类完善版本(修正传入控件集合大小不一致,排序后文本显示问题)

public static class Sort
{

#region 设置PanelControl上按钮显示位置
/// <summary>
/// 设置按钮显示位置
/// </summary>
/// <param name="targetPanel">需要调整按钮顺序的Panel</param>
/// <param name="buttonSpace">按钮间隔</param>
public static void SetButtonCenter(ScrollableControl targetPanel, int buttonSpace)
{
int length = 0;
int maxHeight = 0;
bool controlsHeightSame = true;//控件高度是否一致
List<Control> lisControl = new List<Control>();
System.Windows.Forms.Control.ControlCollection controls = targetPanel.Controls;
foreach (Control btn in controls)
{
lisControl.Add(btn);
length += btn.Width + buttonSpace;
if (maxHeight < btn.Height)//获取最大高度
{
maxHeight = btn.Height;
}
}
//判断控件高度是否一致
//lisControl.ForEach(delegate(Control control)
//{
//    if (control.Height != maxHeight)
//    {
//        controlsHeightSame = false;
//    }
//});
lisControl.ForEach(control =>
{
if (control.Height != maxHeight)
{
controlsHeightSame = false;
}
});
int pnlLength = targetPanel.Width;
if (length > pnlLength) //本身按钮的长度总和大于了panel的长度,不调整
{
return;
}
int startPos = ((pnlLength - length) / 2);
int yPos = 0;
int xPos = startPos;
lisControl.Sort(new ButtonSort());
//控件绘制的起点是左上角的顶点,yPos即控件的左上角顶点的y坐标
if (controlsHeightSame)//控件高度一致
{
if (maxHeight < targetPanel.Height)
{
yPos = (targetPanel.Height - maxHeight) / 2;//距离panel上边框的距离
}
else
{
yPos = targetPanel.Height / 10;//距离panel上边框的距离
}
foreach (Control btn in lisControl)
{
btn.Location = new System.Drawing.Point(xPos, yPos);
xPos += btn.Width + buttonSpace;
}
}
else//控件大小不一致,每个控件的yPos单独计算
{
foreach (Control btn in lisControl)
{
yPos = (targetPanel.Height - btn.Height) / 2;//距离panel上边框的距离
btn.Location = new System.Drawing.Point(xPos, yPos);
xPos += btn.Width + buttonSpace;
}
}

}
#endregion

#region 设置Control上按钮显示位置
/// <summary>
/// 设置按钮显示位置
/// </summary>
/// <param name="container">需要调整按钮顺序的容器控件</param>
/// <param name="buttonSpace">按钮间隔</param>
public static void SetButtonCenter(Control container, int buttonSpace)
{
int length = 0;
int maxHeight = 0;
bool controlsHeightSame = true;//控件高度是否一致
List<Control> listControl = new List<Control>();
System.Windows.Forms.Control.ControlCollection c = container.Controls;
foreach (Control btn in c)
{
listControl.Add(btn);
length += btn.Width + buttonSpace;
if (maxHeight < btn.Height)//获取最大高度
{
maxHeight = btn.Height;
}
}
//判断控件高度是否一致
//listControl.ForEach(delegate(Control control)
//{
//    if (control.Height != maxHeight)
//    {
//        controlsHeightSame = false;
//    }
//});
listControl.ForEach(control =>
{
if (control.Height != maxHeight)
{
controlsHeightSame = false;
}
});
int pnlLength = container.Width;
if (length > pnlLength) //本身按钮的长度总和大于了panel的长度,不调整
{
return;
}
int startPos = ((pnlLength - length) / 2);
int yPos = 0;
int xPos = startPos;
listControl.Sort(new ButtonSort());
//控件绘制的起点是左上角的顶点,yPos即控件的左上角顶点的y坐标
if (controlsHeightSame)//控件高度一致
{
if (maxHeight < container.Height)
{
yPos = (container.Height - maxHeight) / 2;//距离panel上边框的距离
}
else
{
yPos = container.Height / 10;//距离panel上边框的距离
}
foreach (Control btn in listControl)
{
btn.Location = new System.Drawing.Point(xPos, yPos);
xPos += btn.Width + buttonSpace;
}
}
else//控件大小不一致,每个控件的yPos单独计算
{
foreach (Control btn in listControl)
{
yPos = (container.Height - btn.Height) / 2;//距离panel上边框的距离
btn.Location = new System.Drawing.Point(xPos, yPos);
xPos += btn.Width + buttonSpace;
}
}

}
#endregion

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: