[英]Dynamically Created Textboxes not updating
我在Page_Load事件中創建文本框並為其提供值,但是,每當加載詳細信息時,我都會得到相同的輸出。 我似乎總是得到我得到的第一個輸出,即使在隨后的搜索中也是如此。
這是我缺少相關信息的代碼:
Textbox txtName = New Textbox();
protected void Page_Load(object sender, EventArgs e)
{
LoadData();
}
void LoadData()
{
txtName.Text = DropDownList.SelectedValue;
tableCell.Controls.Add(txtName);
}
如果DropDownList
具有兩個值(例如“ Item 1”和“ Item 2”)並啟用了自動回發,則它將首次在文本框中生成並顯示“ Item 1”(DropDownList的默認值),但是如果更改了此值並且自動回發觸發,文本框不會更改。
我試圖通過創建一個新的TextBox來解決此問題,重寫“ LoadPostData”功能以防止此問題被加載,這解決了該問題,但是后來我無法查看數據。
知道我該如何解決嗎? 我可能以錯誤的方式處理此問題。
編輯:我已經向DropDownList
添加了另一個項,該項刪除了TextBox
,以便可以再次重新創建它。 刪除后重新創建時,它似乎顯示正確的數據,但是,如果我嘗試對其進行編輯,則此更新不正確。
Edit2:如果有幫助的話,這是此頁面的其余代碼。 我遇到問題的對象是SBUName和SBUComments,它們都是TextBoxes。 SBUClientDropdown也發生了相同的問題,但我認為解決方案將相似:
DBHandler DBHandler = new DBHandler();
List<string> clients = new List<string>();
List<string> clientGroups = new List<string>();
List<string> sbus = new List<string>();
// Objects for SBU changes
string previousSBU = "";
string previousSBUClient = "";
TextBox SBUName = new TextBox() { ID = "SBUName" };
TextBox SBUComments = new TextBox() { ID = "SBUComments" };
DropDownList SBUClientDropdown = new DropDownList();
protected void Page_Load(object sender, EventArgs e)
{
clients = DBHandler.GetClients();
clientGroups = DBHandler.GetClientGroups();
if (!Page.IsPostBack)
{
foreach (string client in clients)
{
SBUClientList.Items.Add(GenerateItem(client));
ClientList.Items.Add(GenerateItem(client));
}
foreach (string clientGroup in clientGroups)
ClientGroupList.Items.Add(GenerateItem(clientGroup));
}
if ((SBUClientList.SelectedValue.ToString() != previousSBUClient) || (SBUList.SelectedValue.ToString() != previousSBU))
{
previousSBUClient = SBUClientList.SelectedValue.ToString();
previousSBU = SBUList.SelectedValue.ToString();
sbus = DBHandler.GetSBUs(SBUClientList.SelectedValue);
SBUList.Items.Clear();
foreach (string sbu in sbus)
SBUList.Items.Add(GenerateItem(sbu));
LoadSBU();
}
}
void LoadSBU()
{
if ((SBUClientList.SelectedValue.Trim().Length > 0) && (SBUList.SelectedValue.Trim().Length > 0))
{
Entity thisSBU = DBHandler.GetSBUInformation(SBUClientList.SelectedValue, SBUList.SelectedValue);
SBUTable.Rows.Add(GenerateHeaderRow("Client Name", "SBU Name", "Comments"));
SBUClientDropdown.Items.Clear();
foreach (string client in clients)
SBUClientDropdown.Items.Add(GenerateItem(client));
SBUClientDropdown.SelectedValue = SBUClientList.SelectedValue;
SBUClientDropdown.SelectedIndex = SBUClientList.SelectedIndex;
TableCell SBUClientCell = new TableCell();
SBUClientCell.Controls.Add(SBUClientDropdown);
SBUName.Text = thisSBU.sSBUName;
TableCell SBUNameCell = new TableCell();
SBUNameCell.Controls.Add(SBUName);
SBUComments.Text = thisSBU.sSBUComments;
TableCell SBUCommentsCell = new TableCell();
SBUCommentsCell.Controls.Add(SBUComments);
SBUTable.Rows.Add(GenerateRow(SBUClientCell, SBUNameCell, SBUCommentsCell));
Button SBUSaveButton = new Button();
SBUSaveButton.Click += new EventHandler(this.SBUSaveChanges);
SBUSaveButton.Text = "Save SBU Changes";
TableCell SBUButtonCell = new TableCell();
SBUButtonCell.Controls.Add(SBUSaveButton);
SBUButtonCell.ColumnSpan = 3;
TableRow SBUFooter = GenerateRow(SBUButtonCell);
SBUFooter.TableSection = TableRowSection.TableFooter;
SBUTable.Rows.Add(SBUFooter);
}
}
void ShowMessage(string message)
{
OutputString.Text = "<div class=\"message\">" + message + "</div>";
}
ListItem GenerateItem(string input)
{
ListItem output = new ListItem();
output.Text = input;
return output;
}
TableCell GenerateCell(string text)
{
TableCell output = new TableCell();
output.Text = text;
return output;
}
TableRow GenerateRow(params TableCell[] cells)
{
TableRow output = new TableRow();
foreach (TableCell cell in cells)
output.Cells.Add(cell);
return output;
}
TableRow GenerateHeaderRow(params string[] columns)
{
TableRow output = new TableRow();
output.TableSection = TableRowSection.TableHeader;
foreach (string column in columns)
{
TableCell thisCell = new TableCell();
thisCell.Text = column;
output.Cells.Add(thisCell);
}
return output;
}
previousSBUClient和previousSBU在每次回發中始終為空白,那么為什么要在Page_Load上與它們進行比較? 如果要在回發之間保存它們的值,則需要將它們保存在ViewState中,建議使用以下代碼:
public string PreviousSBU
{
get { return Convert.ToString(ViewState["PreviousSBU"] ?? string.Empty); }
set { ViewState["PreviousSBU"] = value; }
}
也許是因為您向表中添加了多個標題行,並且只顯示了第一行到第二行之間的內容? 添加后的任何標題行都不會顯示嗎?
在每個回發中,添加一個新的標題行。 但是TextBox是在每個回發中創建的,並且不會在它們之間保存,因此,在這種情況下,您根本不會看到任何東西。
要將txtName呈現到頁面,您應該具有以下內容:
this.Controls.Add(txtName);
至少在Page_Load中的LoadData()調用之前,但對於您列出的內容,最好在頁面上的某個位置,最好是在Page_Init中。
猜測缺少的代碼,但是您是否要綁定下拉列表? 如果您是您,則可能每次都在執行此操作,而不僅僅是在頁面不是回發時執行。 就像我說的,猜測您的問題不是什么,但您可能想考慮這樣的事情:
if (!Page.IsPostback)
{
MyDropDownList.DataSource = blah;
MyDropDownList.DataBind();
}
myTextBox.Text = MyDropDownList.SelectedValue;
在OnInit事件中創建控件,因為視圖狀態序列化發生在oninit和onload之間。 還要檢查它是否是回發,以避免覆蓋viewstate的值。
我記得如果不向文本框提供ID會發生奇怪的事情,這是在做嗎?
txtName.ID = “txtName的”;`
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.