但是由于"label"控件里文字会根据数量变化,所以控件的长度都不相同(比如1和100所占的长度不同),所以生成的控件排版很乱.
请问我该如何解决?
以下是源代码:
protected void Button1_Click1(object sender, EventArgs e)
{
int x = Int32.Parse(TextBox1.Text);
int z = 1;
for (int y = 0; y < x; y++)
{
TextBox floorData = new TextBox();
TextBox floorVoice = new TextBox();
Label labelData = new Label();
Label labelVoice = new Label();
int i = y + 1;
floorData.ID = "floorData" + i.ToString();
floorVoice.ID = "floorVoice" + i.ToString();
labelData.ID = "labelData" + i.ToString();
labelVoice.ID = "labelVoice" + i.ToString();
labelData.Text = "第" + i.ToString() + "层网络点";
labelVoice.Text = "第" + i.ToString() + "层语音点";
floorData.Width = 85;
floorVoice.Width = 85;
PlaceHolder1.Controls.Add(labelData);
PlaceHolder1.Controls.Add(floorData);
PlaceHolder2.Controls.Add(labelVoice);
PlaceHolder2.Controls.Add(floorVoice);
z++;
}
}
以下是混乱的控件图:
15 个解决方案
#1
每个TextBox占一行多好?为什么要这么排呢?
#2
因为下面还有很多其他选项,而这个数字如果稍微大一点,就会把整个页面拉很长很长....我现在理想的是每行三个左右.....
#3
是够乱的,或者干脆指定一行排两个,指定位置和文本框长度
#4
哥们,我就是不知道怎么指定一排排两个啊......或者排三个四个的.....我就是来问这个的....
#5
动态添加
protected void Page_Load(object sender, EventArgs e)
{
object count = ViewState["count"] ?? "0";
int index;
int.TryParse(count.ToString(), out index);
TextBox txt;
LiteralControl litc;
for (int i = 0; i < index; i++)
{
txt = new TextBox();
txt.ID = string.Format("txt{0}", i);
txt.Text = (i + 1).ToString();
ph.Controls.Add(txt);
litc = new LiteralControl("<br />");
ph.Controls.Add(litc);
}
}
protected void lbtnAdd_Click(object sender, EventArgs e)
{
object count = ViewState["count"] ?? "0";
int index;
int.TryParse(count.ToString(), out index);
TextBox txt = new TextBox();
txt.ID = string.Format("txt{0}", index);
txt.Text = (index + 1).ToString();
ph.Controls.Add(txt);
ViewState["count"] = index + 1;
}
protected void Page_Load(object sender, EventArgs e)
{
object count = ViewState["count"] ?? "0";
int index;
int.TryParse(count.ToString(), out index);
TextBox txt;
LiteralControl litc;
for (int i = 0; i < index; i++)
{
txt = new TextBox();
txt.ID = string.Format("txt{0}", i);
txt.Text = (i + 1).ToString();
ph.Controls.Add(txt);
litc = new LiteralControl("<br />");
ph.Controls.Add(litc);
}
}
protected void lbtnAdd_Click(object sender, EventArgs e)
{
object count = ViewState["count"] ?? "0";
int index;
int.TryParse(count.ToString(), out index);
TextBox txt = new TextBox();
txt.ID = string.Format("txt{0}", index);
txt.Text = (index + 1).ToString();
ph.Controls.Add(txt);
ViewState["count"] = index + 1;
}
#6
额,哥们,动态添加我会,我只是不会限制动态添加的控件每行显示几个而已....
#7
半夜起来告诉你怎么控制如何一行几个元素,具体代码自己添加吧
//定义变量,每行2个元素
int num_oneline=2;
for(int i=0;i<TextBox数量;i++)
{
//在窗体添加控件
//下面一行控制换行
if (i%num_oneline==0)
{
//输出一个换行符
}
}
这是控制一行几个元素的。
你可以用这个办法控制table一行2列了,你在每列中添加控件就整齐了呵呵
//定义变量,每行2个元素
int num_oneline=2;
for(int i=0;i<TextBox数量;i++)
{
//在窗体添加控件
//下面一行控制换行
if (i%num_oneline==0)
{
//输出一个换行符
}
}
这是控制一行几个元素的。
你可以用这个办法控制table一行2列了,你在每列中添加控件就整齐了呵呵
#8
冻死我了,我还光着PP呢,睡觉!
#9
应该使用Table布局。
#10
比如你首先动态创建Table,然后动态创建TableRow并插入Table,然后开始为TableRow内插入TableCell并插入Label和Text。当数量达到3个,就插入一个新的TableRow并插入Table,否则就继续还是使用这个TableRow继续插入TableCell.....
#11
其实最好的做法往往不是编程的,编程的人去搞界面是很笨拙、不适合的。编程的人应该去做底层控件。
你的这个换个思路,将Label和Text的实质变动的数据内容写入一个数据集中,然后绑定给一个DataList控件就一步到位做完了。不是去一味“撅着屁股”去做编码苦力,而应该使用别人做好的控件。
你的这个换个思路,将Label和Text的实质变动的数据内容写入一个数据集中,然后绑定给一个DataList控件就一步到位做完了。不是去一味“撅着屁股”去做编码苦力,而应该使用别人做好的控件。
#12
怎么输出换行符?可以给一个大概的代码吗?不好意思,我刚开始学....
#13
给你一个另外的解决方法
int x = Int32.Parse(idtext.Text);
int z = 1;
StringBuilder roleHTML = new StringBuilder();
roleHTML.Append("<table style=\"FONT-SIZE: 12px\" width=\"100%\" border=\"0\" align=\"center\" cellpadding=\"0\" cellspacing=\"1\"> \n");
for (int y = 0; y < x; y++)
{
int i = y + 1;
roleHTML.Append("<tr> \n");
roleHTML.Append("<td height=\"30\" >第" + i.ToString() + "层网络点</td> \n");
roleHTML.Append("<td height=\"30\" ><input name=\"checkye\" type=\"text\" id=\"checkye\" value=\"" + "" + "\" ></td> \n");
roleHTML.Append("<td height=\"30\" >第" + i.ToString() + "层语音点</td> \n");
roleHTML.Append("<td height=\"30\" ><input name=\"checkye\" type=\"text\" id=\"checkye\" value=\"" + "" + "\" ></td> \n");
roleHTML.Append("</tr> \n");
//TextBox floorData = new TextBox();
//TextBox floorVoice = new TextBox();
//Label labelData = new Label();
//Label labelVoice = new Label();
//int i = y + 1;
//floorData.ID = "floorData" + i.ToString();
//floorVoice.ID = "floorVoice" + i.ToString();
//labelData.ID = "labelData" + i.ToString();
//labelVoice.ID = "labelVoice" + i.ToString();
//labelData.Text = "第" + i.ToString() + "层网络点";
//labelVoice.Text = "第" + i.ToString() + "层语音点";
//floorData.Width = 85;
//floorVoice.Width = 85;
//this.Page.Controls
//sb.Append(labelData);
//sb.Append("</br>");
//sb.Append(floorData);
//sb.Append("</br>");
//sb.Append(labelVoice);
//sb.Append("</br>");
//sb.Append(floorVoice);
//form1.Controls.Add(labelData);
//form1.Controls.Add(floorData);
//form1.Controls.Add(labelVoice);
//form1.Controls.Add(floorVoice);
z++;
}
roleHTML.Append("</table> \n");
this.blstr.Text = roleHTML.ToString();
不过你要是想取得文本框的值的话 就得用js去遍历然后把值放在隐藏域里面然后再到后台去取
int x = Int32.Parse(idtext.Text);
int z = 1;
StringBuilder roleHTML = new StringBuilder();
roleHTML.Append("<table style=\"FONT-SIZE: 12px\" width=\"100%\" border=\"0\" align=\"center\" cellpadding=\"0\" cellspacing=\"1\"> \n");
for (int y = 0; y < x; y++)
{
int i = y + 1;
roleHTML.Append("<tr> \n");
roleHTML.Append("<td height=\"30\" >第" + i.ToString() + "层网络点</td> \n");
roleHTML.Append("<td height=\"30\" ><input name=\"checkye\" type=\"text\" id=\"checkye\" value=\"" + "" + "\" ></td> \n");
roleHTML.Append("<td height=\"30\" >第" + i.ToString() + "层语音点</td> \n");
roleHTML.Append("<td height=\"30\" ><input name=\"checkye\" type=\"text\" id=\"checkye\" value=\"" + "" + "\" ></td> \n");
roleHTML.Append("</tr> \n");
//TextBox floorData = new TextBox();
//TextBox floorVoice = new TextBox();
//Label labelData = new Label();
//Label labelVoice = new Label();
//int i = y + 1;
//floorData.ID = "floorData" + i.ToString();
//floorVoice.ID = "floorVoice" + i.ToString();
//labelData.ID = "labelData" + i.ToString();
//labelVoice.ID = "labelVoice" + i.ToString();
//labelData.Text = "第" + i.ToString() + "层网络点";
//labelVoice.Text = "第" + i.ToString() + "层语音点";
//floorData.Width = 85;
//floorVoice.Width = 85;
//this.Page.Controls
//sb.Append(labelData);
//sb.Append("</br>");
//sb.Append(floorData);
//sb.Append("</br>");
//sb.Append(labelVoice);
//sb.Append("</br>");
//sb.Append(floorVoice);
//form1.Controls.Add(labelData);
//form1.Controls.Add(floorData);
//form1.Controls.Add(labelVoice);
//form1.Controls.Add(floorVoice);
z++;
}
roleHTML.Append("</table> \n");
this.blstr.Text = roleHTML.ToString();
不过你要是想取得文本框的值的话 就得用js去遍历然后把值放在隐藏域里面然后再到后台去取
#14
asp.net的web开发我不熟悉,我给你介绍一下asp的设定一行几个元素的方法吧:
HTML标记语言的
上面的代码你直接复制过去肯定有错误,只是表示如何控制每行仅允许有2个控件。自己根据需要修改一下就行了。
控制关键:模除
HTML标记语言的
<table>
<tr>
<%
for(int i=0;i<TextBox数量;i++)
{
//输出元素
Response.Write("<td>"+元素+"</td>");
//%后的2表示每行2个控件,%后跟数字几就是每行几个控件
if (i%2==0)
{
Response.Write("</tr>");
}
}
%>
</table>
上面的代码你直接复制过去肯定有错误,只是表示如何控制每行仅允许有2个控件。自己根据需要修改一下就行了。
控制关键:模除
#15
是否可以考虑在添加一个Literal控件来换行(每行放两组)
Literal br1 = new Literal();
if(y>0 && y%2==0 )
{
Literal br1=new Literal();
br1.Text="<br>";
PlaceHolder1.Controls.Add(br1);
}
但PlaceHolder2中要实现换行需要再添加一个新的Literal控件,重复一遍如上操作。
Literal br1 = new Literal();
if(y>0 && y%2==0 )
{
Literal br1=new Literal();
br1.Text="<br>";
PlaceHolder1.Controls.Add(br1);
}
但PlaceHolder2中要实现换行需要再添加一个新的Literal控件,重复一遍如上操作。
#1
每个TextBox占一行多好?为什么要这么排呢?
#2
因为下面还有很多其他选项,而这个数字如果稍微大一点,就会把整个页面拉很长很长....我现在理想的是每行三个左右.....
#3
是够乱的,或者干脆指定一行排两个,指定位置和文本框长度
#4
哥们,我就是不知道怎么指定一排排两个啊......或者排三个四个的.....我就是来问这个的....
#5
动态添加
protected void Page_Load(object sender, EventArgs e)
{
object count = ViewState["count"] ?? "0";
int index;
int.TryParse(count.ToString(), out index);
TextBox txt;
LiteralControl litc;
for (int i = 0; i < index; i++)
{
txt = new TextBox();
txt.ID = string.Format("txt{0}", i);
txt.Text = (i + 1).ToString();
ph.Controls.Add(txt);
litc = new LiteralControl("<br />");
ph.Controls.Add(litc);
}
}
protected void lbtnAdd_Click(object sender, EventArgs e)
{
object count = ViewState["count"] ?? "0";
int index;
int.TryParse(count.ToString(), out index);
TextBox txt = new TextBox();
txt.ID = string.Format("txt{0}", index);
txt.Text = (index + 1).ToString();
ph.Controls.Add(txt);
ViewState["count"] = index + 1;
}
protected void Page_Load(object sender, EventArgs e)
{
object count = ViewState["count"] ?? "0";
int index;
int.TryParse(count.ToString(), out index);
TextBox txt;
LiteralControl litc;
for (int i = 0; i < index; i++)
{
txt = new TextBox();
txt.ID = string.Format("txt{0}", i);
txt.Text = (i + 1).ToString();
ph.Controls.Add(txt);
litc = new LiteralControl("<br />");
ph.Controls.Add(litc);
}
}
protected void lbtnAdd_Click(object sender, EventArgs e)
{
object count = ViewState["count"] ?? "0";
int index;
int.TryParse(count.ToString(), out index);
TextBox txt = new TextBox();
txt.ID = string.Format("txt{0}", index);
txt.Text = (index + 1).ToString();
ph.Controls.Add(txt);
ViewState["count"] = index + 1;
}
#6
额,哥们,动态添加我会,我只是不会限制动态添加的控件每行显示几个而已....
#7
半夜起来告诉你怎么控制如何一行几个元素,具体代码自己添加吧
//定义变量,每行2个元素
int num_oneline=2;
for(int i=0;i<TextBox数量;i++)
{
//在窗体添加控件
//下面一行控制换行
if (i%num_oneline==0)
{
//输出一个换行符
}
}
这是控制一行几个元素的。
你可以用这个办法控制table一行2列了,你在每列中添加控件就整齐了呵呵
//定义变量,每行2个元素
int num_oneline=2;
for(int i=0;i<TextBox数量;i++)
{
//在窗体添加控件
//下面一行控制换行
if (i%num_oneline==0)
{
//输出一个换行符
}
}
这是控制一行几个元素的。
你可以用这个办法控制table一行2列了,你在每列中添加控件就整齐了呵呵
#8
冻死我了,我还光着PP呢,睡觉!
#9
应该使用Table布局。
#10
比如你首先动态创建Table,然后动态创建TableRow并插入Table,然后开始为TableRow内插入TableCell并插入Label和Text。当数量达到3个,就插入一个新的TableRow并插入Table,否则就继续还是使用这个TableRow继续插入TableCell.....
#11
其实最好的做法往往不是编程的,编程的人去搞界面是很笨拙、不适合的。编程的人应该去做底层控件。
你的这个换个思路,将Label和Text的实质变动的数据内容写入一个数据集中,然后绑定给一个DataList控件就一步到位做完了。不是去一味“撅着屁股”去做编码苦力,而应该使用别人做好的控件。
你的这个换个思路,将Label和Text的实质变动的数据内容写入一个数据集中,然后绑定给一个DataList控件就一步到位做完了。不是去一味“撅着屁股”去做编码苦力,而应该使用别人做好的控件。
#12
怎么输出换行符?可以给一个大概的代码吗?不好意思,我刚开始学....
#13
给你一个另外的解决方法
int x = Int32.Parse(idtext.Text);
int z = 1;
StringBuilder roleHTML = new StringBuilder();
roleHTML.Append("<table style=\"FONT-SIZE: 12px\" width=\"100%\" border=\"0\" align=\"center\" cellpadding=\"0\" cellspacing=\"1\"> \n");
for (int y = 0; y < x; y++)
{
int i = y + 1;
roleHTML.Append("<tr> \n");
roleHTML.Append("<td height=\"30\" >第" + i.ToString() + "层网络点</td> \n");
roleHTML.Append("<td height=\"30\" ><input name=\"checkye\" type=\"text\" id=\"checkye\" value=\"" + "" + "\" ></td> \n");
roleHTML.Append("<td height=\"30\" >第" + i.ToString() + "层语音点</td> \n");
roleHTML.Append("<td height=\"30\" ><input name=\"checkye\" type=\"text\" id=\"checkye\" value=\"" + "" + "\" ></td> \n");
roleHTML.Append("</tr> \n");
//TextBox floorData = new TextBox();
//TextBox floorVoice = new TextBox();
//Label labelData = new Label();
//Label labelVoice = new Label();
//int i = y + 1;
//floorData.ID = "floorData" + i.ToString();
//floorVoice.ID = "floorVoice" + i.ToString();
//labelData.ID = "labelData" + i.ToString();
//labelVoice.ID = "labelVoice" + i.ToString();
//labelData.Text = "第" + i.ToString() + "层网络点";
//labelVoice.Text = "第" + i.ToString() + "层语音点";
//floorData.Width = 85;
//floorVoice.Width = 85;
//this.Page.Controls
//sb.Append(labelData);
//sb.Append("</br>");
//sb.Append(floorData);
//sb.Append("</br>");
//sb.Append(labelVoice);
//sb.Append("</br>");
//sb.Append(floorVoice);
//form1.Controls.Add(labelData);
//form1.Controls.Add(floorData);
//form1.Controls.Add(labelVoice);
//form1.Controls.Add(floorVoice);
z++;
}
roleHTML.Append("</table> \n");
this.blstr.Text = roleHTML.ToString();
不过你要是想取得文本框的值的话 就得用js去遍历然后把值放在隐藏域里面然后再到后台去取
int x = Int32.Parse(idtext.Text);
int z = 1;
StringBuilder roleHTML = new StringBuilder();
roleHTML.Append("<table style=\"FONT-SIZE: 12px\" width=\"100%\" border=\"0\" align=\"center\" cellpadding=\"0\" cellspacing=\"1\"> \n");
for (int y = 0; y < x; y++)
{
int i = y + 1;
roleHTML.Append("<tr> \n");
roleHTML.Append("<td height=\"30\" >第" + i.ToString() + "层网络点</td> \n");
roleHTML.Append("<td height=\"30\" ><input name=\"checkye\" type=\"text\" id=\"checkye\" value=\"" + "" + "\" ></td> \n");
roleHTML.Append("<td height=\"30\" >第" + i.ToString() + "层语音点</td> \n");
roleHTML.Append("<td height=\"30\" ><input name=\"checkye\" type=\"text\" id=\"checkye\" value=\"" + "" + "\" ></td> \n");
roleHTML.Append("</tr> \n");
//TextBox floorData = new TextBox();
//TextBox floorVoice = new TextBox();
//Label labelData = new Label();
//Label labelVoice = new Label();
//int i = y + 1;
//floorData.ID = "floorData" + i.ToString();
//floorVoice.ID = "floorVoice" + i.ToString();
//labelData.ID = "labelData" + i.ToString();
//labelVoice.ID = "labelVoice" + i.ToString();
//labelData.Text = "第" + i.ToString() + "层网络点";
//labelVoice.Text = "第" + i.ToString() + "层语音点";
//floorData.Width = 85;
//floorVoice.Width = 85;
//this.Page.Controls
//sb.Append(labelData);
//sb.Append("</br>");
//sb.Append(floorData);
//sb.Append("</br>");
//sb.Append(labelVoice);
//sb.Append("</br>");
//sb.Append(floorVoice);
//form1.Controls.Add(labelData);
//form1.Controls.Add(floorData);
//form1.Controls.Add(labelVoice);
//form1.Controls.Add(floorVoice);
z++;
}
roleHTML.Append("</table> \n");
this.blstr.Text = roleHTML.ToString();
不过你要是想取得文本框的值的话 就得用js去遍历然后把值放在隐藏域里面然后再到后台去取
#14
asp.net的web开发我不熟悉,我给你介绍一下asp的设定一行几个元素的方法吧:
HTML标记语言的
上面的代码你直接复制过去肯定有错误,只是表示如何控制每行仅允许有2个控件。自己根据需要修改一下就行了。
控制关键:模除
HTML标记语言的
<table>
<tr>
<%
for(int i=0;i<TextBox数量;i++)
{
//输出元素
Response.Write("<td>"+元素+"</td>");
//%后的2表示每行2个控件,%后跟数字几就是每行几个控件
if (i%2==0)
{
Response.Write("</tr>");
}
}
%>
</table>
上面的代码你直接复制过去肯定有错误,只是表示如何控制每行仅允许有2个控件。自己根据需要修改一下就行了。
控制关键:模除
#15
是否可以考虑在添加一个Literal控件来换行(每行放两组)
Literal br1 = new Literal();
if(y>0 && y%2==0 )
{
Literal br1=new Literal();
br1.Text="<br>";
PlaceHolder1.Controls.Add(br1);
}
但PlaceHolder2中要实现换行需要再添加一个新的Literal控件,重复一遍如上操作。
Literal br1 = new Literal();
if(y>0 && y%2==0 )
{
Literal br1=new Literal();
br1.Text="<br>";
PlaceHolder1.Controls.Add(br1);
}
但PlaceHolder2中要实现换行需要再添加一个新的Literal控件,重复一遍如上操作。