0

私の問題は、動的に作成されたセルに動的リンクボタンを作成していることです。正常に機能していますが、動的リンクボタンのクリックイベントハンドラーが起動していません。インターネットで十分に検索しましたが、何も機能していません。ページの読み込み。これにより、動的なセルボタンとリンクボタンを作成するためのメソッドが呼び出されます。しかし、それでもクリックイベントは発生しません...私のプロジェクトの構造がそのようなものであるため、oninitでさえ機能しません.this.imがページの読み込み時にメソッドを呼び出していくつかの作業を行い、thnがこのcreateメソッドを呼び出す他の解決策はありますか?

     protected void create()
      {

        for (int j = 0; j < 8; j++)
       {
        Label lbl;
        LinkButton lnk;
        TableRow tRow = new TableRow();
        for (int i = 0; i < 6; i++)
        {
            TableCell tCellLessonPlan = new TableCell();
            lbl = new Label();

            lnk = new LinkButton();


                lnk.Click += new System.EventHandler(this.LinkButton_Click);


                lbl.Text = "Period";
                lnk.Text = "Details";
                tCellLessonPlan = createCell(tCellLessonPlan.Text);
                tCellLessonPlan.Controls.Add(lbl);
                tCellLessonPlan.Controls.Add(lnk);
               tRow.Cells.Add(tCellLessonPlan);

        }
        Table1.Rows.Add(tRow);
    }
}

     protected TableCell createCell(string cellText)
{
    TableCell tCell = new TableCell();
    Unit height = new Unit(20, UnitType.Pixel);
    tCell.Height = height;
    Unit width = new Unit(190, UnitType.Pixel);
    tCell.Width = width;
    tCell.BorderStyle = BorderStyle.Solid;
    tCell.BorderColor = System.Drawing.Color.Black;
    tCell.BorderWidth = Unit.Point(2);

    tCell.Text = cellText;
    return tCell;

}


protected void LinkButton_Click(object sender, EventArgs e)
{
    LinkButton lnk = (LinkButton)sender;
    //Some logic here.
}
4

1 に答える 1

3

貼り付けたコードと、Page_Load以前から呼び出されたという事実から、これは機能するはずです。おそらくいくつかの重要なコードを省略しています。これをデバッグするには

  1. Webページを開きます
  2. ソースを表示し、ボタンを見つけてIDを確認します
  3. Page_Loadにブレークポイントを設定します
  4. ボタンをクリックします
  5. Request.FormボタンIDがクライアントから投稿されているかどうかを表示および確認します

常に同じコントロールを作成しているとは限らず、それに基づいて異なるIDを取得する可能性があります。ボタンが最初にレンダリングされたときとPostBackが発生したときに、IDが異なっていないことを確認する必要があります。これを行うには、サーバー側でボタンとその親のIDを設定します。


ASP.NETイベントはどのように機能しますか

Webサイトはステートレスなユーザーインターフェイスです。これは、サーバーがユーザーに表示される出力を生成し、それらを気にしないことを意味します。一部の作業に対するユーザーの要求を処理するために、ユーザーのブラウザーはサーバーに情報を送信します。これは、イベントの処理にも当てはまります。サーバーは、どのイベントを処理する必要があるかを知るために、すべてのコントロールを作成してから、どのユーザーが送信したデータをチェックし、どのコントロールユーザーが自分のアクションのターゲットになっているかを確認する必要があります。当然のことながら、サーバーがコントロールを探してイベントハンドラーを見つけることができるように、コントロールを十分に早く作成する必要があります。

ページのライフサイクルにはいくつかの段階があります。ライフサイクルは、ユーザーのブラウザがサーバーにリクエストを送信したときに始まり、サーバーがそのリクエストへの応答を出力したときに終了します。ユーザーのブラウザがページを完全にロードした時点で、サーバーはそれを認識していません。サーバーにデータを送り返すボタンがクリックされると、サーバーは再びページベースを作成し、ページは別のライフサイクルを通過します。ライフサイクルの段階は次のとおりです。

  1. ページリクエスト-この段階ではページは作成されていません。クライアントからのリクエストのみが受信されています。
  2. 開始-ページの基本的な前処理が実行されます。リクエストがポストバックであるかどうかを確認します。
  3. 初期化-この時点でコントロールは作成されていますが、ビューステートとポストバックデータはまだ処理されていません
  4. ロード-制御情報は、ビュー状態と制御状態から回復されます
  5. ポストバックイベント処理-ポストバック....イベント処理
  6. レンダリング-ビューとコントロールの状態が保存され、Renderコントロールツリーごとに呼び出されます
  7. アンロード-リクエストは破棄されます

ご想像のとおり、3、4、5が重要です。次の段階ではポストバックイベントの処理が行われるため、初期化段階または最新のロード段階でコントロールを作成する必要があります。

サーバーはどのイベントハンドラーを呼び出すかをどのように知るのですか?ユーザーは、イベントがトリガーされたコントロールとイベント自体を見つけるために必要なすべての情報を投稿します。このデータは、制御タイプによって異なります。

たとえば、次のコードを考えてみましょう。

protected void Page_Load(object sender, EventArgs e)
{
    CreateControls();
}

public void CreateControls()
{
    LinkButton linkBtn = new LinkButton();
    linkBtn.ID = "btnTest";
    linkBtn.Text = "test";
    linkBtn.Click += new EventHandler(btn_Click);
    pnl.Controls.Add(linkBtn);

    Button btn = new Button();
    btn.ID = "btnTest2";
    btn.Text = "test";
    btn.Click += new EventHandler(btn_Click);
    pnl.Controls.Add(btn);
}

ここでは、コントロールを動的に追加し、イベントハンドラーをアタッチしています。ページが最初にレンダリングされたときにユーザーが送信したリクエストデータは次のようになります。 初回実行時にデータを要求する

ユーザーがクリックするLinkButtonと、ページが再度処理され、ユーザーは追加情報をページに送信して、実行する必要があることを確認します。 LinkBut​​tonがクリックされた後にデータを要求する ユーザーのブラウザーは、キーの下にフォームデータでコントロールIDを送信し__EVENTTARGETます。サーバーは、が設定されているかどうかを確認し、__EVENTTARGET設定されている場合は、イベントを処理する必要があることを認識しています。これは、上からステージ5で発生します。サーバーは制御を探し、デフォルトのイベントをトリガーします(とのClick場合)。LinkButtonButton

Buttonコントロール についても同様のことが起こります。ボタンがクリックされた後にデータを要求する 今回は、コントロールIDがフォームデータのキー値として送信されます。フォームデータでは、そのキーの下valueにボタンを表すhtml要素があります(この場合、値testはボタンのテキストです)。


これは、ASP.NETでイベントが処理される方法の基本を理解するのに十分なはずです。これに従って、ブレークポイントをに配置し、それが設定されているかどうかをPage_Load確認Request.Form["__EVENTTARGET"]します。設定されている場合は、その時点でコントロールが作成されているかどうか、同じIDを持っているかどうか、イベントハンドラーがアタッチされているかどうかを確認します。それでもイベントがトリガーされない場合は、そのコントロール(またはその親)を削除するか、リクエストのライフサイクルのステージ5の前にイベントハンドラーをデタッチします。

于 2013-03-20T08:54:47.040 に答える