1

バックエンドとしてプログラムでボタンASP.NETを追加しようとしています。C#ボタンを表示することはできますが、ユーザーがボタンをクリックしても RowCommand が起動されません。

問題は、ユーザーが「送信」ボタンをクリックした後にボタンを作成していることだと思います。page_load でボタンを作成すると、RowCommand が機能します。

ウェブサイトの流れは次のとおりです。

  1. ページの読み込み: 基本データを表示します。
  2. ユーザーが [送信] ボタンをクリックすると、 が作成され、 が作成されGridViewますButtonFieldGridViewと の両方がButtonFieldバックエンドで動的に作成されます。
  3. 次に、ユーザーが生成されたボタンをクリックすると、RowCommand

コードは次のとおりです。

Page_load

protected void Page_Load(object sender, EventArgs e)
    {
     //Nothing because we only want to create the button after the user
     //clicks on submit   
    }

randomGridView

Gridviews とボタンを生成します

public void randomGridView(Table t, int x)
    {

        GridView gv1 = new GridView();
        GridView gv2 = new GridView();
        GridView gv3 = new GridView();
        GridView gv4 = new GridView();

        TableRow r = new TableRow();
        for (int i = 0; i < x; i++)
        {
            TableCell c = new TableCell();
            c.BorderStyle = BorderStyle.Solid;
            if (i == 0)
            {
                c.Controls.Add(gv1);
            }
            if (i == 1)
            {
                c.Controls.Add(gv2);
            }
            if (i == 2)
            {
                c.Controls.Add(gv3);
            }
            if (i == 3)
            {
                c.Controls.Add(gv4);
            }
            r.Cells.Add(c);
        }
        t.Rows.Add(r);

        //Where the xml gets bonded to the data grid
        XmlDataSource xds = new XmlDataSource();

        xds.Data = xml;
        xds.DataBind();
        xds.EnableCaching = false;

        gv1.DataSource = xds;

        ButtonField temp = new ButtonField();
        temp.ButtonType = ButtonType.Image;
        temp.ImageUrl = "~/checkdailyinventory.bmp";
        temp.CommandName = "buttonClicked";
        temp.HeaderText = " ";
        gv1.Columns.Add(temp);

        gv1.RowCommand += new GridViewCommandEventHandler(CustomersGridView_RowCommand);
        gv1.RowDataBound += new GridViewRowEventHandler(inventoryGridView_RowDataBound);
        gv1.DataBind();

        xds.Data = xml;
        xds.DataBind();
        xds.EnableCaching = false;

        gv2.DataSource = xds;
        gv2.DataBind();


        xds.Data = xml;
        xds.DataBind();
        xds.EnableCaching = false;

        gv3.DataSource = xds;
        gv3.DataBind();

        xds.Data = xml;
        xds.DataBind();
        xds.EnableCaching = false;

        gv4.DataSource = xds;
        gv4.DataBind();
    }

inventoryGridView_RowDataBound

最初のセルに手動でボタンを追加しようとした場所

public void inventoryGridView_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        Button temp = new Button();
        temp.CommandName = "buttonClicked";
        temp.Text = "temp button!";
        e.Row.Cells[0].Controls.Add(temp);
    }

CustomersGridView_RowCommand

これは解雇する必要があるものです

public void CustomersGridView_RowCommand(Object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "buttonClicked")
        {
            int index = Convert.ToInt32(e.CommandArgument);
            Label1.Text = index.ToString();

        }
    }

Button1_Click

グリッドビューとボタンを実際に作成するもの

public void Button1_Click(object sender, EventArgs e)
    {
        randomGridView(Table1, 1);
        randomGridView(Table2, 4);
    }

では、ボタンを発射するにはどうすればよいCustomersGridView_RowCommandですか?または、動的に生成されたボタンをリンクすることは不可能ですか?

編集: ASPX ページは次のとおりです。

        <table>
            <tr>
                <td>
                    <div id="div1" style="width: 257px; height: 500px; overflow-x: scroll; overflow-y: hidden;">
                        <asp:Table ID="Table1" runat="server">
                        </asp:Table>
                    </div>
                </td>
                <td>
                    <div id="div2" style="width: 500px; height: 500px; overflow: scroll;">
                        <asp:Table ID="Table2" runat="server">
                        </asp:Table>
                    </div>
                </td>
            </tr>
        </table>
4

2 に答える 2

3

不可能ではありません。コントロール ツリー (randomGridView メソッドで補足する) は、ページがビュー ステートから再ロードされると自動的に再構築されることを理解する必要がありますが、これらの動的に追加されたコントロールのイベント ハンドラーは自動的に再構築されません。

特に、イベント ハンドラーをアタッチする次の行:

gv1.RowCommand += new GridViewCommandEventHandler(CustomersGridView_RowCommand); 

ビューステートからページをリロードするときに再実行されることはありません。これは、グリッド内のボタンの 1 つをクリックし、ブラウザーがページをサーバーにポストするときに実行する必要があります。

解決策は、Load イベント フェーズでページのポストバック状態を確認することです。Page.IsPostBack が true の場合、これらの動的に生成されたグリッドのコントロール ツリーをスキャンし、RowCommand イベントのイベント ハンドラー (上記のコードのような) を設定します。

于 2012-06-21T18:42:54.917 に答える
1

動的に作成した後、最終的に RowCommand を起動することができました。これが私の解決策ですが、これが最善の方法だとは言えません。

protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);

        if (IsPostBack){
            if (Request.Form[Button1.UniqueID] != null)
            {
                //Get the data from the server
                randomGridView(Table1, 1);
                randomGridView(Table2, 4);
            }
            //Just display the form here



        }
    }

ここで、button_click イベントが発生するまで待つ代わりに、ボタンがクリックされたかどうかを OnInit でチェックします。そうであれば、ユーザーがデータを読み込んで表示することを望んでいることがわかります。現在、上記のコードでは、同じ関数でデータを作成して表示するだけです (これは悪い設計ですが、単にプロトタイプを作成しただけです)。

次に、ユーザーがポストバックの原因となるものをクリックすると、テーブルがコントロールに追加されます。次に、コントロールを起動できます(理由や方法はわかりませんが、機能します..)

ボタン機能さえ必要ないことを示すためだけに:

        public void Button1_Click(object sender, EventArgs e)
    {
        //randomGridView(Table1, 1);
        //randomGridView(Table2, 4);
        //Session.Add("doIt",true);
    }

繰り返しますが、これはおそらく最善の方法ではありませんが、機能します。誰かがより良い解決策を持っている場合は、私に知らせてください。

于 2012-06-22T18:22:51.863 に答える