2

IPostBackEventHandler インターフェイスを実装する複数のコントロールを含む ASP.Net ページがあります。コードの簡易バージョンを以下に示します。

public partial class WebForm1 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        //Custom Control
        MyTextBox mytxt = new MyTextBox();
        mytxt.ID = "mytxt";
        mytxt.TextChange += mytxt_TextChange;
        this.Form.Controls.Add(mytxt);

        //Custom Control
        MyButton mybtn = new MyButton();
        mybtn.ID = "mybtn";
        mybtn.Click += mybtn_Click;
        this.Form.Controls.Add(mybtn);
    }

    void mybtn_Click(object sender, EventArgs e)
    {
        Response.Write("mybtn_Click");
    }

    void mytxt_TextChange(object sender, EventArgs e)
    {
        Response.Write("mytxt_TextChange");
    }
}

[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")]
public class MyTextBox : Control, IPostBackEventHandler
{
    public event EventHandler TextChange;

    protected virtual void OnTextChange(EventArgs e)
    {
        if (TextChange != null)
        {
            TextChange(this, e);
        }
    }

    public void RaisePostBackEvent(string eventArgument)
    {
        OnTextChange(new EventArgs());
    }

    protected override void Render(HtmlTextWriter output)
    {
        output.Write("<input type='text' id='" + ID + "' name='" + ID + "' onchange='__doPostBack(&#39;" + ID + "&#39;,&#39;&#39;)' />");
    }
}

[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")]
public class MyButton : Control, IPostBackEventHandler
{
    public event EventHandler Click;

    protected virtual void OnClick(EventArgs e)
    {
        if (Click != null)
        {
            Click(this, e);
        }
    }

    public void RaisePostBackEvent(string eventArgument)
    {
        OnClick(new EventArgs());
    }

    protected override void Render(HtmlTextWriter output)
    {
        output.Write("<input type='button' id='" + ID + "' name='" + ID + "' value='Click Me' onclick='__doPostBack(&#39;" + ID + "&#39;,&#39;&#39;)' />");
    }
}

IPostBackEventHandler インターフェイスを実装する MyTextBox と MyButton の 2 つのカスタム コントロールがあります。MyTextBox には TextChange イベントがあり、MyButton には Click イベントがあります。

ページに 1 つのコントロール (MyTextBox または MyButton) のみを保持する場合、イベントはプロパティを起動します。しかし、ページ上の両方のコントロールで、MyButton をクリックした後でも MyTextBox TextChange イベントが発生します。MyTextBox がページ上にある場合、MyButton Click イベントは発生しません。

ここに投稿する前に、複数のことを試しました。助けてくれてありがとう。

4

1 に答える 1

0

この問題の原因は、コントロールの UniqueID で __doPostBack メソッドを呼び出す必要があることです。これは非常に重要です。また、基本的にサーバー コントロールは、ClientID を要素の ID としてレンダリングし、UniqueID を要素名としてレンダリングします。したがって、レンダリング メソッドを次のように更新すると、すべてが機能します。

テキストボックス:

output.Write("<input type='text' id='" + this.ClientID + "' name='" + this.UniqueID + "' onchange='__doPostBack(&#39;" + this.UniqueID + "&#39;,&#39;&#39;)' />");

ボタン:

output.Write("<input type='button' id='" + this.ClientID + "' name='" + this.UniqueID + "' value='Click Me' onclick='__doPostBack(&#39;" + this.UniqueID + "&#39;,&#39;&#39;)' />");

編集

UniqueID を使用しても、問題の解決には役立たないようです。問題の原因はわかりませんが、基本 WebControl クラスを使用してカスタム テキスト ボックスを上書きしようとしましたが、これは問題の解決に役立ちます。したがって、この実装を試すことができます。

[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")]
public class MyTextBox : WebControl, IPostBackEventHandler
{
    public event EventHandler TextChange;

    protected virtual void OnTextChange(EventArgs e)
    {
        if (TextChange != null)
        {
            TextChange(this, e);
        }

    }

    public void RaisePostBackEvent(string eventArgument)
    {
        OnTextChange(new EventArgs());
    }

    protected override HtmlTextWriterTag TagKey
    {
        get
        {
            return HtmlTextWriterTag.Input;
        }
    }

    protected override void AddAttributesToRender(HtmlTextWriter writer)
    {
        base.AddAttributesToRender(writer);
        writer.AddAttribute(HtmlTextWriterAttribute.Onchange, Page.ClientScript.GetPostBackEventReference(this, string.Empty));
        writer.AddAttribute("onkeypress", "if (WebForm_TextBoxKeyHandler(event) == false) return false;");
        writer.AddAttribute(HtmlTextWriterAttribute.Type, "text");
    }
}
于 2012-10-22T20:35:59.537 に答える