1

TableCell オブジェクトの OnClick イベント ハンドラをプログラムで設定する方法を探しています。私がやろうとしていることに相当する ASP は次のようになります。

<asp:TableCell OnClick="clickHandler" runat="server">Click Me!</asp:TableCell>

上記の例では、「clickHandler」は .cs CodeBehind で定義されたサーバー側関数です。

public virtual void clickHandler(object sender, EventArgs args) {...}

ただし、私の状況では、この TableCell オブジェクトを動的に作成する必要があるため、ASP タグで設定することはできません。コードビハインドで次のようなことをしようとしています:

System.Web.UI.WebControls.TableRow row = new System.Web.UI.WebControls.TableRow();
System.Web.UI.WebControls.TableCell cell = new System.Web.UI.WebControls.TableCell();
cell.Text = "Click Me!";
cell.Attributes.Add("onClick", "clickHandler");
row.Cells.Add(cell);

残念ながら、この状況では:

cell.Attributes.Add("onClick", "clickHandler");

「clickHandler」は、クライアント側の JavaScript 関数としてのみ機能します。私が探しているのは、.cs CodeBehind で定義されているサーバー側の clickHandler() 関数をこのテーブル セルにリンクする方法です。

午後の検索の後、実用的な解決策を思いつくことができませんでした. 助けてくれてありがとう。

4

2 に答える 2

4

たくさんの作業と研究の結果、実用的なソリューションをまとめることができましたが、すでに組み込まれているはずの何かのために非常に多くの作業が行われているようです。私が行ったことは、System.Web.UI.WebControls.TableCellオブジェクトを拡張して、OnClickイベントのハンドルを含めることでした。

using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace MyWebApp
{


    public class ExpandableTableCell : TableCell, IPostBackEventHandler, INamingContainer
    {
        private static readonly object click_event = new object();

        public ExpandableTableCell()
        {
        }

        // public handles for adding and removing functions to be called on the click event
        public event EventHandler Click
        {
            add
            {
                Events.AddHandler(click_event, value);
            }
            remove
            {
                Events.RemoveHandler(click_event, value);
            }
        }

        // define parent function that will be called when the container is clicked
        protected void Click(EventArgs e)
        {
            EventHandler h = Events[click_event] as EventHandler;
            if (h != null)
            {
                h(this, e);
            }
        }

        // specify the "post back event reference" or id of the click event
        protected override void AddAttributesToRender(HtmlTextWriter writer)
        {
            base.AddAttributesToRender(writer);
            writer.AddAttribute(HtmlTextWriterAttribute.Onclick, 
                                Page.ClientScript.GetPostBackEventReference(this, "custom_click"));
        }

        // link the custom click id to the click function
        void System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(string eventArgument)
        {
            if(eventArgument == "custom_click")
            {
                this.OnClick(EventArgs.Empty);
            }
        }
    }
}

新しいクラスの使用方法は次のとおりです(ストックのTableCellとほぼ同じです)。

System.Web.UI.WebControls.TableRow row = new System.Web.UI.WebControls.TableRow();
ExpandableTableCell click_cell = new ExpandableTableCell();
click_cell.Text = "Click Me!";
click_cell.Click += clickHandler;
// extra little touch for mouseover event
click_cell.Attributes.Add("onmouseover", "this.style.cursor='pointer'");
row.Cells.Add(click_cell);

私が言ったように、コードビハインドでOnClickメソッドを設定するためにクラスを拡張するという問題を経験することは過度であるように思われます。上記のコードをクリーンアップまたは正当化するための他のアイデアや方法があれば、私に知らせてください。

于 2010-04-19T06:16:31.403 に答える
1

これがあなたの問題に関連しているかどうかはわかりませんが、サーバー側の関数を LinkBut​​ton に追加しようとしていたところ、次の (VB) コードが見つかりました: AddHandler cell.Click, AddressOf clickHandler、これでうまくいきました。

このコード変換サービスによると、これcell.Click += clickHandler;は C# に変換されます。

お役に立てれば!

于 2012-06-29T15:16:53.627 に答える