怎样在WEB页面上 控制"动态添加生成的控件" 每行显示的数量?

时间:2021-01-06 05:48:09
我添加了一个textbox1的控件,根据用户输入的数量,生成相应数量的"textbox"和"Label"控件.

但是由于"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++;
            }

        }


以下是混乱的控件图:
怎样在WEB页面上 控制"动态添加生成的控件" 每行显示的数量?

15 个解决方案

#1


每个TextBox占一行多好?为什么要这么排呢?

#2


引用 1 楼 yalan 的回复:
每个TextBox占一行多好?为什么要这么排呢?


因为下面还有很多其他选项,而这个数字如果稍微大一点,就会把整个页面拉很长很长....我现在理想的是每行三个左右.....

#3


是够乱的,或者干脆指定一行排两个,指定位置和文本框长度

#4


引用 3 楼 myhfw003 的回复:
是够乱的,或者干脆指定一行排两个,指定位置和文本框长度


哥们,我就是不知道怎么指定一排排两个啊......或者排三个四个的.....我就是来问这个的....

#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;
  }

#6


引用 5 楼 wuyq11 的回复:
动态添加
protected void Page_Load(object sender, EventArgs e)
  {
  object count = ViewState["count"] ?? "0";
  int index;
  int.TryParse(count.ToString(), out index);
  TextBox txt;
  LiteralCont……


额,哥们,动态添加我会,我只是不会限制动态添加的控件每行显示几个而已....

#7


半夜起来告诉你怎么控制如何一行几个元素,具体代码自己添加吧

//定义变量,每行2个元素
int num_oneline=2;
for(int i=0;i<TextBox数量;i++)
{
    //在窗体添加控件

     //下面一行控制换行
     if (i%num_oneline==0)
    {
       //输出一个换行符
    }
}



这是控制一行几个元素的。
你可以用这个办法控制table一行2列了,你在每列中添加控件就整齐了呵呵

#8


冻死我了,我还光着PP呢,睡觉!

#9


引用楼主 jobiq 的回复:
我添加了一个textbox1的控件,根据用户输入的数量,生成相应数量的"textbox"和"Label"控件.

但是由于"label"控件里文字会根据数量变化,所以控件的长度都不相同(比如1和100所占的长度不同),所以生成的控件排版很乱.

请问我该如何解决?

以下是源代码:
C# code
      protected void Button1_Click1(object……


应该使用Table布局。

#10


比如你首先动态创建Table,然后动态创建TableRow并插入Table,然后开始为TableRow内插入TableCell并插入Label和Text。当数量达到3个,就插入一个新的TableRow并插入Table,否则就继续还是使用这个TableRow继续插入TableCell.....

#11


其实最好的做法往往不是编程的,编程的人去搞界面是很笨拙、不适合的。编程的人应该去做底层控件。

你的这个换个思路,将Label和Text的实质变动的数据内容写入一个数据集中,然后绑定给一个DataList控件就一步到位做完了。不是去一味“撅着屁股”去做编码苦力,而应该使用别人做好的控件。

#12


引用 7 楼 yalan 的回复:
半夜起来告诉你怎么控制如何一行几个元素,具体代码自己添加吧

//定义变量,每行2个元素
int num_oneline=2;
for(int i=0;i<TextBox数量;i++)
{
    //在窗体添加控件

     //下面一行控制换行
     if (i%num_oneline==0)
    {
       //输出一个换行符
    }
}

……



怎么输出换行符?可以给一个大概的代码吗?不好意思,我刚开始学....

#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去遍历然后把值放在隐藏域里面然后再到后台去取

#14


asp.net的web开发我不熟悉,我给你介绍一下asp的设定一行几个元素的方法吧:
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控件,重复一遍如上操作。         

#1


每个TextBox占一行多好?为什么要这么排呢?

#2


引用 1 楼 yalan 的回复:
每个TextBox占一行多好?为什么要这么排呢?


因为下面还有很多其他选项,而这个数字如果稍微大一点,就会把整个页面拉很长很长....我现在理想的是每行三个左右.....

#3


是够乱的,或者干脆指定一行排两个,指定位置和文本框长度

#4


引用 3 楼 myhfw003 的回复:
是够乱的,或者干脆指定一行排两个,指定位置和文本框长度


哥们,我就是不知道怎么指定一排排两个啊......或者排三个四个的.....我就是来问这个的....

#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;
  }

#6


引用 5 楼 wuyq11 的回复:
动态添加
protected void Page_Load(object sender, EventArgs e)
  {
  object count = ViewState["count"] ?? "0";
  int index;
  int.TryParse(count.ToString(), out index);
  TextBox txt;
  LiteralCont……


额,哥们,动态添加我会,我只是不会限制动态添加的控件每行显示几个而已....

#7


半夜起来告诉你怎么控制如何一行几个元素,具体代码自己添加吧

//定义变量,每行2个元素
int num_oneline=2;
for(int i=0;i<TextBox数量;i++)
{
    //在窗体添加控件

     //下面一行控制换行
     if (i%num_oneline==0)
    {
       //输出一个换行符
    }
}



这是控制一行几个元素的。
你可以用这个办法控制table一行2列了,你在每列中添加控件就整齐了呵呵

#8


冻死我了,我还光着PP呢,睡觉!

#9


引用楼主 jobiq 的回复:
我添加了一个textbox1的控件,根据用户输入的数量,生成相应数量的"textbox"和"Label"控件.

但是由于"label"控件里文字会根据数量变化,所以控件的长度都不相同(比如1和100所占的长度不同),所以生成的控件排版很乱.

请问我该如何解决?

以下是源代码:
C# code
      protected void Button1_Click1(object……


应该使用Table布局。

#10


比如你首先动态创建Table,然后动态创建TableRow并插入Table,然后开始为TableRow内插入TableCell并插入Label和Text。当数量达到3个,就插入一个新的TableRow并插入Table,否则就继续还是使用这个TableRow继续插入TableCell.....

#11


其实最好的做法往往不是编程的,编程的人去搞界面是很笨拙、不适合的。编程的人应该去做底层控件。

你的这个换个思路,将Label和Text的实质变动的数据内容写入一个数据集中,然后绑定给一个DataList控件就一步到位做完了。不是去一味“撅着屁股”去做编码苦力,而应该使用别人做好的控件。

#12


引用 7 楼 yalan 的回复:
半夜起来告诉你怎么控制如何一行几个元素,具体代码自己添加吧

//定义变量,每行2个元素
int num_oneline=2;
for(int i=0;i<TextBox数量;i++)
{
    //在窗体添加控件

     //下面一行控制换行
     if (i%num_oneline==0)
    {
       //输出一个换行符
    }
}

……



怎么输出换行符?可以给一个大概的代码吗?不好意思,我刚开始学....

#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去遍历然后把值放在隐藏域里面然后再到后台去取

#14


asp.net的web开发我不熟悉,我给你介绍一下asp的设定一行几个元素的方法吧:
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控件,重复一遍如上操作。