从同一控件内部引用用户控件中的文本框
本文关键字:控件 文本 用户 引用 内部 | 更新日期: 2023-09-27 18:37:05
我有一个带有文本框和按钮的用户控件。当我按下按钮时,我尝试使用文本框的 ID(从用户控件的代码隐藏)读取内容,但我总是得到一个空白结果。从同一用户控件引用用户控件中的控件的正确方法是什么。
我在其他地方读到我应该简单地使用控件 ID,但不知何故它不起作用。我一定做错了什么,我希望这是一个常见的错误,有人可以对此有所了解。
编辑:
标记:
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="ForumPostControl.ascx.cs" Inherits="ForumPostControl" debug="true" %>
<div id="PostDiv" runat="server">
<table width="100%" cellpadding="0" cellspacing="0" border="0" style="border:1px solid white; border-radius:5px; margin-bottom:5px;">
<tr>
<td valign="top" width="52" style="text-align:center; padding:10px 0px 10px 0px; border-bottom:1px dashed #FFF;">
<asp:Image ID="imgReplyPoster" runat="server" />
</td>
<td valign="middle" style="text-align:left; padding:10px 0px 10px 0px; border-bottom:1px dashed #FFF;">
<asp:HyperLink ID="lnkReplyPoster" runat="server">lnkReplyPoster</asp:HyperLink><br />
<asp:Label ID="lblCreated" runat="server" Text="Label"></asp:Label>
</td>
<td style="text-align:right; padding:10px 20px 10px 0px; border-bottom:1px dashed #FFF;">
<asp:LinkButton ID="btnReply" runat="server" onclick="btnReply_Click">Reply</asp:LinkButton>
<asp:LinkButton ID="btnDelete" runat="server" OnClick="btnDelete_Click" OnClientClick="return ConfirmClick('Do you really want to delete this post?');"><img src="images/icons/trash16.png" alt="Delete" border="0" /></asp:LinkButton>
</td>
</tr>
<tr>
<td valign="top" align="justify" style="padding:10px;" colspan="3">
<asp:Literal ID="ltrlPostBody" runat="server"></asp:Literal>
</td>
</tr>
</table>
<asp:PlaceHolder ID="phReply" runat="server" Visible="False">
<div align="center" style="padding:5px 10px 10px 10px;">
<asp:HiddenField ID="hdnParentID" runat="server" />
<table cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<asp:TextBox ID="txtReply" runat="server"></asp:TextBox>
</td>
</tr>
<tr>
<td align="right" style="padding-top:20px;">
<asp:LinkButton ID="lnkPostReply" runat="server" OnClick="lnkPostReply_Click">Post reply</asp:LinkButton>
</td>
</tr>
</table>
</div>
</asp:PlaceHolder>
</div>
用于将文本保存到数据库的代码隐藏:
protected void lnkPostReply_Click(Object sender, EventArgs e)
{
String connectionString = (String)System.Configuration.ConfigurationManager.AppSettings["ConnectionString"];
SqlConnection cnn = new SqlConnection(connectionString);
SqlCommand cmd;
String strSQL;
cnn.Open();
strSQL = "INSERT INTO ForumThreads (ForumID, ParentID, PostBody, Created, CreatedBy, Modified, ModifiedBy) VALUES " +
"(@ForumID, @ParentID, @PostBody, GETDATE(), @CreatedBy, GETDATE(), @CreatedBy);";
cmd = new SqlCommand(strSQL, cnn);
cmd.Parameters.AddWithValue("@ForumID", prvForumID);
cmd.Parameters.AddWithValue("@ParentID", prvForumThreadID);
cmd.Parameters.AddWithValue("@PostBody", txtReply.Text);
cmd.Parameters.AddWithValue("@CreatedBy", CurrentMember.MemberID);
cmd.ExecuteNonQuery();
cmd.Dispose();
cnn.Close();
cnn.Dispose();
Response.Redirect("forum_topic.aspx?TID=" + prvEncryptedTID);
}
问题出在读取 txtReply 控件时。
编辑 #2
我仍在为此苦苦挣扎并尝试东西。这里有一些发现,希望能帮助解开谜团。我注意到我可以从文本框控件读取属性,例如宽度和 ID,但我无法读取用户输入的文本。它始终返回空白。如果我以编程方式将文本预设为"初始文本",那么当我尝试读取 .text 属性时,无论用户输入什么,我仍然会得到"初始文本"。就好像用户键入的文本在回发时丢失了。
正如您提到的,您在中继器中使用用户控件,我将检查页面的Page_Load事件方法,以查看我没有在回发时重新绑定转发器:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
Repeater1.DataSource = GetData();
Repeater1.DataBind();
}
}
我的Repeater1_ItemDataBound可能看起来像这样:
protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
ForumPostControl myControl = (ForumPostControl)e.Item.FindControl("ForumPostControl1");
myControl.MyProperty = 20;//My custom property of user control
}
}
现在,每次回发都可能清除我的用户控件的自定义属性。我需要确保它在回发时持续存在。在我的ForumPostControl.ascx中.cs我会将此属性的值存储在visestate中,并在需要时进行检索。我应该在我的用户控件中有以下代码:
public int MyProperty
{
get
{
int myProperty = 0;
if (ViewState["MyProperty"] != null)
{
int.TryParse(ViewState["MyProperty"].ToString(), out myProperty);
}
return myProperty;
}
set
{
ViewState["MyProperty"] = value;
}
}