1

テキスト ボックスとボタンを備えたユーザー コントロールがあります。ボタンを押すと、(ユーザー コントロールのコード ビハインドから) テキスト ボックスの 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 プロパティを読み込もうとすると、ユーザーが何を入力しても「初期テキスト」が表示されます。ユーザーが入力したテキストがポストバックで失われたかのようです。

4

1 に答える 1

1

リピーター内でユーザーコントロールを使用していると述べたように、ページの 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;
    }
}
于 2013-10-27T15:18:24.613 に答える