我正在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;
}
答案 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的”;`