0

いくつかのイメージ ボタンをグリッドビューに配置しましたが、クリック イベントをキャプチャできません。クリック イベントの作成も、グリッドビューでの OnRowCommand ハンドラーの作成も機能しません。

ボタンをクリックすると、単に現在のページにポストバックされます。

次のようにボタンを追加します。

protected void gridview1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        string status = DataBinder.Eval(e.Row.DataItem, "visitstatusuid").ToString();

        string visitUID = DataBinder.Eval(e.Row.DataItem, "visituid").ToString();

        Color backColor = Color.White;
        Color foreColor = Color.Black;

        ImageButton b;

        switch (status)
        {
            case "U": // Unallocated
                backColor = ColorTranslator.FromHtml("#B2A1C7");
                b = new ImageButton();
                b.Width = Unit.Pixel(25);
                b.Height = Unit.Pixel(30);
                b.AlternateText = "Book";
                b.ImageUrl = "../../Images/New/booking.gif";
                b.ToolTip = "Booking";
                b.CommandName = "Booking";
                b.CommandArgument = visitUID;
                b.CausesValidation = false;

                e.Row.Cells[(e.Row.Cells.Count - 3)].Controls.Add(b);

4

5 に答える 5

0

ボタンの作成時にハンドラーをアタッチする必要があります。

b.Click += MyButtonClickEventHandler;

編集
OnRowDataBoundハンドラーでボタンを作成する代わりに、OnRowCreatedを使用します。
これにより、ポストバックでボタンが確実に再作成されます。

例:

protected void Page_Load(object sender, EventArgs e)
{
  if (!IsPostBack) {
    BindData();
  }
}

protected void BindData()
{
  // Do your databinding here.
}

protected void MyGridView_RowCreated(object sender, GridViewRowEventArgs e)
{
  var b = new ImageButton();
  b.AlternateText = "Click Me!";
  // Etc.

  b.Click += MyButton_Click;
  // Add the button to the column you want.
}

protected void MyButton_Click(object sender, ImageClickEventArgs e)
{
  // Do your thing...
}
于 2009-09-28T12:38:11.613 に答える
0

グリッドビューのRowCommandイベントハンドラーを作成し、コマンド名をチェックして、それがトリガーされているボタンかどうかを確認します

の効果に何か

void gridview1_RowCommand(object sender, args e)
{

if (e.CommandName == "Booking")
{
// call your desired method here
}

}
于 2009-09-28T14:00:48.543 に答える
0

ポスト バックしないように、グリッドのバインド イベントを配置します。

于 2009-10-08T06:33:39.230 に答える
0

イベント ハンドラーを別の場所に追加する場合をAutoEventWireup="true"除き、aspx ファイルのページ ディレクティブで設定する必要があります。

そうは言っても、メソッドに次AutoEventWireupの行を追加するのではなく、イベントを明示的に配線することを好みます。OnInit

gridview1.RowDataBound += this.gridview1_RowDataBound;
于 2009-09-28T12:36:42.377 に答える
0

RowDataBound を使用したアプローチを機能させるには、クリック イベントが時間内に登録されるように、ページの読み込みごとにグリッドを再バインドし、ライフサイクルの OnLoad までに再バインドする必要があります。

私が成功した別のアプローチは、DataGrid ボタンのセットアップを行うための新しいメソッドを作成することです。

void PerformConditionalGridFormatting()
{
    foreach (GridViewRow row in gvCaseList.Rows)
    {
        if (row.RowType == DataControlRowType.DataRow)
        {
             ... Add your buttons to the cells here
        }
    }
}

次に、手動データバインドを実行するたびにメソッドを呼び出します。また、ポストバックごとに、つまり OnLoad ハンドラーで次のように呼び出します。

if (Page.IsPostBack) PerformConditionalGridFormatting();

このアプローチの利点は、すべてのポストバックでデータバインドする必要がないため、リソースが節約されることです。

于 2009-09-28T13:31:24.510 に答える