6

GridViewプログラムでボタン付きをに追加する方法がわかりませんUpdatePanel

ボタンやラベルなどの簡単なコントロールでそれを行うことができますが、ボタンでを追加しようとするGridViewと、いっぱいになりPostback()ます。

<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">


protected override void OnInit(EventArgs e)
{
UpdatePanel up1 = new UpdatePanel();
    up1.ID = "UpdatePanel1";



    Button button1 = new Button();
    button1.ID = "Button1";
    button1.Text = "Submit";
    button1.Click += new EventHandler(Button_Click);


    Label label1 = new Label();
    label1.ID = "Label1";
    label1.Text = "A full page postback occurred.";


    GridView gv1 = new GridView();
    //Where the xml gets bonded to the data grind
    XmlDataSource xds = new XmlDataSource();
    xds.Data = xml;
    xds.DataBind();
    xds.EnableCaching = false;

    gv1.DataSource = xds;
    createButton(gv1, up1);
    gv1.RowCommand += new GridViewCommandEventHandler(CustomersGridView_RowCommand);
    gv1.DataBind();




    up1.ChildrenAsTriggers = true;

    up1.ContentTemplateContainer.Controls.Add(button1);
    up1.ContentTemplateContainer.Controls.Add(label1);

    up1.ContentTemplateContainer.Controls.Add(gv1);

    Page.Form.Controls.Add(up1);
}

protected void Page_Load(object sender, EventArgs e)
{


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

    }
}

void createButton(GridView g)
{
    ButtonField tea = new ButtonField();
    tea.ButtonType = ButtonType.Image;
    tea.ImageUrl = "~/checkdailyinventory.bmp";
    tea.CommandName = "buttonClicked";
    tea.HeaderText = "space";
    g.Columns.Add(tea);
}

protected void Button_Click(object sender, EventArgs e)
{
    ((Label)Page.FindControl("Label1")).Text = "Panel refreshed at " +
        DateTime.Now.ToString();
}

</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title>UpdatePanel Constructor Example</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Button ID="Button2" runat="server" Text="Button" />
        <asp:ScriptManager ID="ScriptManager1" runat="server" />
    </div>
    </form>
</body>
</html>

では、ボタンがクリックされた場合にUpdatePanelフルになることなく、プログラムでボタン付きのグリッドビューを追加するにはどうすればよいでしょうか。PostBack()GridView

編集:私が試した他のこと

   void gv1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    AsyncPostBackTrigger t = new AsyncPostBackTrigger();
    t.ControlID = e.Row.Cells[0].ClientID;
    t.EventName = "blah";
    up1.Triggers.Add(t);
}
4

2 に答える 2

2

によると:

また、設計時に更新パネルを作成してもかまいません。プログラムで何か(ボタンを含むグリッドビューを含むテーブルなど)を追加して、部分的なポストバックを実行できるようにする必要があります。

基本的に、私はあなたのコードを小さな変更で使用しました:

  • イベントからバインディングを削除し、イベントInitで実行しますLoad

  • UpdatePanelネストされたパネルを使用して設計時に作成され、動的コントロールをそのパネルに追加するだけです。

このコードはそれを行います(私の環境で動作します):

ASPX

    <asp:ScriptManager runat="server" />
    <asp:UpdatePanel runat="server">
        <ContentTemplate>
            <asp:Panel runat="server" ID="myPanel">
            </asp:Panel>
            <br />
            <asp:Label runat="server" ID="lblMessage"></asp:Label>
        </ContentTemplate>
    </asp:UpdatePanel>

背後にあるコード

    protected void Page_Init(object sender, EventArgs e)
    {
        Button button1 = new Button();
        button1.ID = "Button1";
        button1.Text = "Submit";
        button1.Click += new EventHandler(Button_Click);

        Label label1 = new Label();
        label1.ID = "Label1";
        label1.Text = "A full page postback occurred.";

        var s1 = Builder<Product>.CreateListOfSize(15).Build();
        GridView gv1 = new GridView();
        gv1.DataSource = s1;
        createButton(gv1);
        gv1.RowCommand += new GridViewCommandEventHandler(CustomersGridView_RowCommand);

        this.myPanel.Controls.Add(button1);
        this.myPanel.Controls.Add(label1);
        this.myPanel.Controls.Add(gv1);
    }

    void createButton(GridView g)
    {
        ButtonField tea = new ButtonField();
        tea.ButtonType = ButtonType.Image;
        tea.ImageUrl = "~/checkdailyinventory.bmp";
        tea.CommandName = "buttonClicked";
        tea.HeaderText = "space";
        g.Columns.Add(tea);
    }

    protected void Button_Click(object sender, EventArgs e)
    {
        ((Label)Page.FindControl("Label1")).Text = "Panel refreshed at " +
            DateTime.Now.ToString();
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        this.DataBind();
    }

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

            this.lblMessage.Text = DateTime.Now.ToString();
        }
    }

出力

ここに画像の説明を入力してください

于 2012-07-05T18:26:24.470 に答える
2

設計時にGridViewを配置し、設定して非表示にすることはできませんVisible=falseか?

繰り返す必要のあるグリッドビューの数がわからない場合は、GridViewをListViewでラップできます。コンセプトはここで紹介されています:

これは完璧な解決策ではないかもしれません。これまでにレンガの壁にぶつかったと思われる賞金があるので、これを見て提供すると思いました。

于 2012-07-05T18:41:19.330 に答える