动态创建的文本框不更新

时间:2011-04-04 20:07:01

标签: c# asp.net

我正在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”)并且启用了autopostback,第一次它将生成并在文本框中显示“Item 1”(DropDownList的默认值) ),但是如果这个被更改并且autopostback触发,则文本框不会改变。

我尝试通过创建一个新的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;
}

5 个答案:

答案 0 :(得分:1)

previousSBUClient和previousSBU在每个帖子后面总是空白,那你为什么要在Page_Load上与它们进行比较呢?如果你想在回发之间保存它们的值,你需要将它们保存在ViewState中,我建议使用如下代码:

public string PreviousSBU
{
    get { return Convert.ToString(ViewState["PreviousSBU"] ?? string.Empty); }
    set { ViewState["PreviousSBU"] = value; }
}

也许是因为你向表中添加了多个标题行,只显示第一个到第二个之间的内容?添加后的任何标题行都不显示?

在每个回发上添加一个新的标题行。但是TextBox是在每个回发上创建的,而不是在它们之间保存的,所以如果是这样你就不应该看到任何东西。

答案 1 :(得分:0)

要将txtName呈现给页面,您应该具有以下内容:

this.Controls.Add(txtName);页面上的某个地方,最好是在Page_Init中,但是至少在你列出的内容之前,至少在Page_Load中的LoadData()调用之前。

答案 2 :(得分:0)

猜测丢失的代码但您是否在下载列表中进行数据绑定?如果你是,你可能每次都这样做,而不仅仅是当页面不是回发时。就像我说的那样,猜测你问题中没有的东西,但你可能想要考虑这样的事情:

if (!Page.IsPostback)
{
  MyDropDownList.DataSource = blah;
  MyDropDownList.DataBind();
}

myTextBox.Text = MyDropDownList.SelectedValue;

答案 3 :(得分:0)

在OnInit事件中创建控件,因为viewinate序列化发生在oninit和onload之间。还要检查它是否是回发,以避免覆盖viewstate中的值。

答案 4 :(得分:0)

我记得如果你没有为文本框提供ID,会发生奇怪的事情,你这样做吗?

txtName.ID = “txtName的”;`