2011-07-26 50 views
0

此頁面用於檢索數據並顯示在頁面中並使用戶能夠編輯信息。如何在運行時動態創建TextBox控件/使用.cs的問題

此時我需要檢索數據並將其顯示在文本框中。

因爲我也必須從數據中檢索多個數據並顯示在每個不同的文本框上。

我的.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

+1

只要提一下,以這種方式使用'string + ='就會導致性能下降。對任何重要的文本建築使用'StringBuilder'。 – SWeko

+0

另外,由於您使用的是固定模板,並向其中注入了值,請查看'string.Format',它可能會爲您節省一些麻煩。 – SWeko

+0

你能舉個例子嗎?它真的會幫助我,謝謝 –

回答

1

你需要什麼?我的事情你有一個糟糕的設計你的應用程序和你的問題的最佳解決方案,它使用另一種方法顯示您的數據和控制。據我瞭解 - 你需要顯示許多中繼器數據塊,包括你的文本框。嘗試閱讀關於中繼器控制。例如,您的問題將有一個解決方案:

<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(); 
} 

}

鐵道部關於轉發器可以讀取here

+0

我已經嘗試過這種數據的數量,但ü可以指導我如何使用 的foreach(在ChildImageDT.Rows的DataRow DR) 與中繼器..我似乎無法得到填充數據 –

+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>"); 
    } 
    
+0

對不起,我不明白你想說什麼,你能提供一個更密切的例子使用我的代碼?非常感謝 –

0

您需要正確建立的控件樹。例如,您需要實例化一個TextBox(TextBox txt = new TextBox())並將其添加到另一個控件的Controls集合中。對於這種類型的事情,我會在標記中定義一個asp:Panel,並在後面的代碼中添加我的動態控件

+0

是的,我已經嘗試過,但我無法設置每個文本框的位置在我想要的位置。和文本框的數量取決於檢索 –

1

您應該使用Repeater control或其他數據中繼器控件來構建這樣的佈局。

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(); 
     } 

當然,你需要定義類,實現數據contrcats,accordin你的任務。

我強烈建議你花一兩天時間閱讀關於直放站的章節。相信我,如果你這麼做的話 - 你創建yuor程序的進度會大大加快。

p.s .:嘗試準備好關於Linq - 它非常強大的技術,以取代您的foreach這樣的任務。

+0

好吧,將研究更多關於這些話題。感謝你的建議。 只是一件事。使用這種解決方案,(因爲我有2組數據將生成2箇中繼器)我得到了2箇中繼器顯示。但與數據文本框仍然不會出現 –

+0

這裏是我得到的:從檢查元素看。但文本框和文本不會出現。 ID如何?爲每個中繼器的文本框使用相同的ID?任何方式使它不同? –