动态在WinForm中加入可视化控件并要与参照物对齐。我这种做法可以怎么改进?

崔鹏飞 2009-02-06 03:21:53
窗体最上方已经有一个label,两个TextBox,需要根据指定数字添加N个label,2N个TextBox。并与最上方对齐。
下面是我的做法,把TextBox存入数组是因为一会儿还要用里面的值。
请问有什么别的改进方法?更巧妙的?
谢谢!

public void BuildUI()
{
TBSet1=new TextBox[CourseNums];
TBSet2 = new TextBox[CourseNums];//数组。CourseNums:用户指定个数

Label currentL = label4;//参照物
TextBox currentTB1=textBox1;//参照物
TextBox currentTB2=textBox2;//参照物
for (int i = 1; i <= CourseNums-1; i++)
{
Label la = new Label();

la.AutoSize = true;
la.Location = new Point(currentL.Location.X,currentL.Location.Y+30);
la.Size = new System.Drawing.Size(71, 12);
la.Text ="第"+(i+1)+"门课程:";

Controls.Add(la);
currentL = la;
//---------------------------------
TextBox tb1 = new TextBox();
tb1.Location = new System.Drawing.Point(89,currentTB1.Location.Y+30);
tb1.Size = new System.Drawing.Size(45, 21);

Controls.Add(tb1);
currentTB1 = tb1;
//------------------------------------
TextBox tb2 = new TextBox();
tb2.Location = new System.Drawing.Point(158, currentTB2.Location.Y + 30);
tb2.Size = new System.Drawing.Size(45, 21);

Controls.Add(tb2);
currentTB2 = tb2;
//------------------------------
TBSet1[0] = textBox1;
TBSet2[0] = textBox2;

TBSet1[i] = tb1;
TBSet2[i] = tb2;
}


}


...全文
332 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zgke 2009-02-19
  • 打赏
  • 举报
回复
见个用户控件~~放LABLE TEXTBOX TEXTBOX 然后添加用户控件 然后设置DOCK 为TOP
yulinlover 2009-02-15
  • 打赏
  • 举报
回复
这种大量数据编辑的情况,最好用Grid类的控件,否则会很痛苦!你要用模板表去维护他的各种属性,否则扩展性也的不到保证
宝_爸 2009-02-06
  • 打赏
  • 举报
回复
没啥好方法,只能根据参照物计算,top+固定的距离
xxlxmd 2009-02-06
  • 打赏
  • 举报
回复
不知道 这样行不行。。。

你把 新加的控件的 LEFT TOP两个属性 分别赋值。。
TOP 就让他 递增 两个控件 上下距离多少 你久TOP+多少
LEFT 跟上个控件的值一样就行了
崔鹏飞 2009-02-06
  • 打赏
  • 举报
回复
可以设置Form为AutoSize吧?[Quote=引用 8 楼 net_boy 的回复:]
最好不要把ClassItem直接放到窗体上,这样当显示高度超出窗体高度时就看不到下面的了。

你可以放置容器控件到窗体上,然后把ClassItem放到容器里,设置容器自动出现滚动条。
这样就不用动态计算窗体的高度了。
[/Quote]
net_boy 2009-02-06
  • 打赏
  • 举报
回复
最好不要把ClassItem直接放到窗体上,这样当显示高度超出窗体高度时就看不到下面的了。

你可以放置容器控件到窗体上,然后把ClassItem放到容器里,设置容器自动出现滚动条。
这样就不用动态计算窗体的高度了。
net_boy 2009-02-06
  • 打赏
  • 举报
回复
LibraryFileItem是我的控件,相当于上面我说的ClassItem
containerFiles相当于你的Form


LibraryFileItem fileItem;
foreach (LibraryFile item in _files)
{
fileItem = new LibraryFileItem(item);
fileItem.Width = containerFiles.Width - 2;
fileItem.Dock = DockStyle.Top;
fileItem.LibraryFileCheck += new EventHandler<LibraryFileCheckEventArgs>(fileItem_LibraryFileCheck);
fileItem.LibraryImportRename += new EventHandler<LibraryImportRenameEventArgs>(fileItem_LibraryImportRename);
containerFiles.Height = containerFiles.Height + fileItem.Height;
containerFiles.Controls.Add(fileItem);
}
net_boy 2009-02-06
  • 打赏
  • 举报
回复
把每行的Label及2个TextBox设计成用户控件。假如叫ClassItem
然后,动态添加时,设置dock = top就行了。
崔鹏飞 2009-02-06
  • 打赏
  • 举报
回复
是不是可以用FlexGrid?
zoOoz 2009-02-06
  • 打赏
  • 举报
回复
楼主蛮OK的啦,是不是拿出来晒的 啊
崔鹏飞 2009-02-06
  • 打赏
  • 举报
回复
也就是类似这样喽?
la.Location = new Point(currentL.Location.X,currentL.Location.Y+30);          
[Quote=引用 2 楼 findcaiyzh 的回复:]
没啥好方法,只能根据参照物计算,top+固定的距离
[/Quote]

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧