如何在运行时动态创建TextBox控件/ .cs的问题

时间:2011-07-26 06:51:58

标签: c# html

此页面用于检索数据并在页面中显示,并允许用户编辑信息。

此时我需要检索数据并将其显示在文本框中。

因为我还必须从数据中检索多个数据并显示在每个不同的文本框上。

我的.cs代码如下:

foreach (DataRow dr in ChildImageDT.Rows)
{
  myImage = new Images();
  myImage.DateTaken = DateTime.Parse(dr["image_taken_dt"].ToString());
  myImage.PlaceTaken = dr["image_taken_loc"].ToString();
  myImage.DetailedInfo = dr["image_info"].ToString();

  tableString += "<tr><td>Date Taken:</td>";
  tableString += "<td><asp:TextBox ID=\"txtDateOfBirth\">" + myImage.DateTaken + "</asp:TextBox>";
  tableString += "<asp:CalendarExtender ID=\"CalendarExtender1\" runat=\"server\" CssClass=\"AjaxCalendar\"";
  tableString += "PopupButtonID=\"imgCalendar\" PopupPosition=\"Right\" TargetControlID=\"txtDateOfBirth\" Format=\"MM/dd/yyyy\"></asp:CalendarExtender>";
  **tableString += "<asp:TextBoxWatermarkExtender ID=\"TextBoxWatermarkExtender1\" runat=\"server\" TargetControlID=\"txtDateOfBirth\" WatermarkText=\"Month/Day/Year\" WatermarkCssClass=\"watermarked\"></asp:TextBoxWatermarkExtender>";**
  tableString += "<asp:Image ID=\"imgCalendar\" runat=\"server\" ImageUrl=\"img/Button/calendar.png\" Width=\"20px\" /></td>";
  **tableString += "<td rowspan=3 ><input type=\"button\" class=\"right_content\" title=\"" + " " + "\"";
  tableString += "onClick =\"location.href='ViewProfile.aspx?cid=" + "" + "'\" ";
  tableString += "style=\"background-size:100%; background:url('/img/missing%20children%20pictures/";**
  tableString += "" + ".jpg')\"/></td></tr>";
  tableString += "<tr><td>Place Taken:</td>";
  **tableString += "<td>" + textbox1.Text = myImage.PlaceTaken;**
  tableString += "</td><td></td></tr>";
  tableString += "<tr><td rowspan=3>Detailed Info:</td>";
  tableString += "<td rowspan=3><input id=\"txtImageDetailedInfo\" type=\"text\">" + myImage.DetailedInfo + "</input></td><td></td></tr>";
  tableString += "<tr><td><input id=\"SetProfilePicture\" type=\"radio\" /></td></tr>";
  tableString += "<tr><td><input id=\"DeletePhoto\" type=\"checkbox\" /></td></tr>";
}

页面应如下所示: 每张照片都有自己的描述,我需要从中检索所有的图像和数据 Screenshot

5 个答案:

答案 0 :(得分:1)

我认为您可以更好地编写代码。我建议两种方式:

  1. 您可以使用PlaceHolder控件并将控件添加到占位符。您可以通过Literal Control添加html。

    LiteralControl lit = new LiteralControl("<tr><td>Date Taken:</td>");
    placeHolder1.Controls.Add(lit);
    
    [Code]
    
    var txt = new TextBox();
    txt.Text = [Data];
    PlaceHolder1.Controls.Add(txt);
    
  2. 您可以覆盖Render页面事件并通过HTMLTextWriter编写html。

    protected override void Render(HtmlTextWriter output) {
      output.Write ("<h3> Hello </h3>");
    }
    

答案 1 :(得分:1)

你需要什么?我认为你的应用程序设计不好,而你的问题的最佳解决方案是使用其他方法来显示你的数据和控件。据我了解你 - 你需要显示许多转发器数据块,包括你的文本框。尝试阅读有关Repeater Control的信息。例如,您的问题将有下一个解决方案:

    <asp:Repeater ID="Repeater1" runat="server">
    <ItemTemplate>
        <table>
            <tr>
                <td>UserName:</td>
                <td><asp:TextBox ID="txtName" runat="server" /></td>
            </tr>
            <tr>
                <td>Image:</td>
                <td><asp:TextBox ID="txtPassword" Text="<%#Eval("Password")%>" runat="server" /></td>
            </tr>
            <tr>
                <td>Image:</td>
                <td><asp:Image ID="TextBox1" ImageUrl="<%#Eval("ImgUrl")%>" runat="server" /></td>
            </tr>
        </table>
    </ItemTemplate>
</asp:Repeater>

在代码中你可以使用你的转发器:

public partial class _Default : System.Web.UI.Page
{
    private class User
    {
        public string Name { get; set; }
        public string Password { get; set; }
        public string ImageUrl { get; set; }
    }

protected void Page_Load(object sender, EventArgs e)
{
    var userList = new[] {
        new User {Name = "user1", Password = "pass1", ImageUrl = "img1.jpg"},
        new User {Name = "user2", Password = "pass2", ImageUrl = "img2.jpg"},
        new User {Name = "user3", Password = "pass3", ImageUrl = "img3.jpg"},
    };

    Repeater1.DataSource = userList;
    Repeater1.DataBind();
}

}

关于Repeater的你可以阅读here

答案 2 :(得分:1)

您应该使用Repeater control或其他一些数据转发器控件来构建此类布局。

答案 3 :(得分:1)

根据你的问题:

  

我试过这个,但是你可以指导我如何使用foreach(ChildImageDT.Rows中的DataRow dr)和转发器。我似乎无法填充数据

尝试下一步:

            var userList = new List<User>();
            foreach (DataRow row in dataTable.Rows)
            {
                var user = new User()
                               {
                                   Name = row["Name"].ToString(),
                                   Password = row["Password"].ToString(),
                                   ImageUrl = row["ImageUrl"].ToString()
                               };
                userList.Add(user);
            }

            repeater1.DataSource = userList;
            repeater1.DataBind();
        }

当然,您需要根据您的任务定义实现数据控制的类。

我强烈建议你花一两天时间阅读有关Repeater的章节。相信我,如果你这样做 - 你的创造计划的进度会大大加快。

p.s。:尝试为Linq做好准备 - 这是一项非常强大的技术,可以替代你的 foreach ,就像这样。

答案 4 :(得分:0)

您需要正确构建控制树。例如,您需要实例化TextBox(TextBox txt = new TextBox())并将其添加到另一个控件的Controls集合中。对于这种类型的事情,我将在标记中定义一个asp:Panel,并在

后面的代码中添加我的动态控件