我的方案:
- 我有一个标签以及一些在 asp:Updatepanel 中加载的文本框。这些控件最初加载了 SQL 数据库中的值。这些值基于传递给页面的初始索引。
- 此外,该页面包含一个网格视图,其中包含“联系人”列表。
- 这个想法是,如果用户从 gridview 中选择一个联系人,则使用索引重新查询 SQL db。此函数返回一个数据表,用于使用选定的联系人数据(姓名、地址、电子邮件等)填充上述文本框。然后,用户可以根据需要修改文本框。
- 目前,我正在使用 asp:timer 在选择不同的联系人时触发更新面板(尽管我欢迎更优雅的触发解决方案)。
首次加载页面时,所有控件都将毫无问题地填充。
The problem: When subsequent users are selected, ONLY the label value changes - NOT the textbox values.
我试过的:
- 如果我禁用计时器/触发器,那么当在 gridview 中选择记录时,即使标签也不会更新。这似乎表明计时器/触发器作为 AsyncPostBackTrigger 是有效的(启用时)。
- 对于文本框,我尝试了如何分配文本框值的变体(例如 Textboxt1.text = value; TextBox1.Attributes.Add("value", value1);
- 此外,我没有使用 asp:Textbox,而是尝试使用:< input type="text" id="TextBox1" runat="server" />
我正在尝试做的甚至可能 - 我错过了什么?
标记:
<asp:Timer runat="server" ID="Timer1" Interval="400" Enabled="false" OnTick="ContactsTimer_Tick" />
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional" >
<ContentTemplate>
<asp:Label ID="lblContactAccountID" runat="server"/>
<asp:TextBox ID="txtContactFirstName" runat="server"/>
<%--edit: also tried:
<input type="text" id="txtContactFirstName" runat="server" />--%>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="ContactsTimer" EventName="Tick" />
</Triggers>
</asp:UpdatePanel>
<asp:GridView ID="gvContacts" runat="server" CssClass="table table-striped solid-top" AutoGenerateColumns="false"
DataKeyNames="PersonID" OnRowCommand="gvContacts_RowSelected">
<Columns>
<asp:BoundField DataField="PersonID" />
<asp:TemplateField HeaderText="Name" ItemStyle-Width="10%" ItemStyle-HorizontalAlign="Center">
<ItemTemplate>
<asp:LinkButton runat="server" CommandName="Selected" CommandArgument="<%# Container.DataItemIndex %>"><%#Eval("LastName")%></asp:LinkButton>
<asp:LinkButton runat="server" CommandName="Selected" CommandArgument="<%# Container.DataItemIndex %>"><%#Eval("FirstName")%></asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Action" ItemStyle-Width="10%" ItemStyle-HorizontalAlign="Center">
<ItemTemplate>
<asp:ImageButton runat="server" ImageUrl="~/Images/icon_pencil.png" ToolTip='<%# "Edit Profile for " + Eval("firstname") + " " + Eval("lastname") %>' CommandName="Edit" CommandArgument="<%# Container.DataItemIndex %>" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
代码隐藏:
private void LoadSelectedContact(int personID)
{
DataTable dt = GetProfileContacts(personID, true);
if (dt.Rows.Count > 0)
{
foreach (DataRow row in dt.Rows)
{
lblContactAccountID.Text = row["PersonID"].ToString();
txtContactFirstName.Text = row["FirstName"].ToString();
// edit: also tried the below without success
// string FirstName = row["FirstName"].ToString();
// txtContactFirstName.value= FirstName;
// txtContactFirstName.Attributes.Add("value", FirstName);
// ...
ContactsTimer.Enabled = true;
}
}
}
protected void ContactsTimer_Tick(object sender, EventArgs e)
{
ContactsTimer.Enabled = false;
upnlContacts.Update();
}
protected void gvContacts_RowSelected(object sender, GridViewCommandEventArgs e)
{
GridViewRow row;
if (e.CommandSource.ToString() == "System.Web.UI.WebControls.ImageButton")
{
row = (GridViewRow)((ImageButton)e.CommandSource).NamingContainer;
}
else
{
row = (GridViewRow)((LinkButton)e.CommandSource).NamingContainer;
}
int personID = Int32.Parse(row.Cells[0].Text);
switch (e.CommandName)
{
case "Selected":
LoadSelectedContact(personID);
break;
//case "Edit" ...
}
}