簡體   English   中英

動態創建的文本框未更新

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM