0

パラメータ化されたsqldatasourceによって情報を取得するグリッドビューがあります。ボタンを押して、フィールドの 1 つ (id) を送信して関数を起動したいと考えています。しかし、機能も起動しません..

ここに私のaspx部分があります:

 <asp:SqlDataSource ID="SqlDataSource2" runat="server" 
        ConnectionString="<%$ ConnectionStrings:igroup20_test2ConnectionString %>" 
        SelectCommand="select mie.e_num, mie.id, m.f_name, m.l_name from memberInEvent mie, member m where e_num=@num and mie.id=m.id" >
        <SelectParameters>
            <asp:Parameter DefaultValue="066643776" Name="num" Type="String" />

        </SelectParameters>
    </asp:SqlDataSource>

    <asp:PlaceHolder ID="head_line_ph" runat="server"></asp:PlaceHolder>
    <br /><br />

    <asp:GridView ID="GridView1" runat="server" DataSourceID="SqlDataSource1" 
            AutoGenerateColumns="false" CssClass="tableStatic">
        <Columns>

            <asp:TemplateField HeaderText="הסר מאירוע">
                <ItemTemplate>
                    <asp:Button ID="delete_mem" CommandArgument='<%# Bind("id") %>' runat="server" Text="הסר מאירוע" OnClick="remove_member" CssClass="btn btn-primary" />
                </ItemTemplate>
            </asp:TemplateField>
            <asp:BoundField ReadOnly="True" HeaderText="ת.ז" 
                  InsertVisible="False" DataField="id"
                    SortExpression="ת.ז">

                </asp:BoundField>

                <asp:BoundField ReadOnly="True" HeaderText="שם פרטי" 
                  InsertVisible="False" DataField="f_name"
                    SortExpression="שם פרטי">

                </asp:BoundField>

                <asp:BoundField ReadOnly="True" HeaderText="שם משפחה" 
                  InsertVisible="False" DataField="l_name"
                    SortExpression="שם משפחה">

                </asp:BoundField>


        </Columns>
    </asp:GridView>

ここに私のコードビハインドがあります:

protected void Page_Load(object sender, EventArgs e)
    {


        string e_num = Request.QueryString["enum"];

        Label headline_lbl = new Label();
        headline_lbl.Text = db.return_event_name(e_num);
        headline_lbl.CssClass = "head_line";
        head_line_ph.Controls.Add(headline_lbl);

        SqlDataSource2.SelectParameters["num"].DefaultValue = e_num;
        GridView1.DataSourceID = "SqlDataSource2";
        GridView1.DataBind();

        if (!IsPostBack)
        {
            List<string[]> ids_list = db.return_ids_for_event(Convert.ToInt32(e_num));

            foreach (string[] s in ids_list)
            {
                DropDownList1.Items.Add(new ListItem(s[0], s[1]));

            }
        }


    }

protected void remove_member(object sender, EventArgs e)
    {

        string mem_id = ((Button)sender).CommandArgument;

        db.remove_member(mem_id, num);

        Response.Redirect("memberInevents.aspx?enum=" + num);
    }

編集:

Suhani Mody の回答を読んだ後、次のようにグリッドビューの行コマンドで起動するように変更しました (ただし、起動しません)。

<asp:GridView ID="GridView1" OnRowCommand="GridView1_RowCommand" runat="server" DataSourceID="SqlDataSource1" 
            AutoGenerateColumns="false" CssClass="tableStatic">
        <Columns>

            <asp:TemplateField HeaderText="הסר מאירוע">
                <ItemTemplate>
                    <asp:Button ID="delete_mem" CommandArgument='<%# Bind("id") %>' CommandName="MyRowButton" runat="server" Text="הסר מאירוע"  CssClass="btn btn-primary" />
                </ItemTemplate>
            </asp:TemplateField>
            <asp:BoundField ReadOnly="True" HeaderText="ת.ז" 
                  InsertVisible="False" DataField="id"
                    SortExpression="ת.ז">

                </asp:BoundField>

                <asp:BoundField ReadOnly="True" HeaderText="שם פרטי" 
                  InsertVisible="False" DataField="f_name"
                    SortExpression="שם פרטי">

                </asp:BoundField>

                <asp:BoundField ReadOnly="True" HeaderText="שם משפחה" 
                  InsertVisible="False" DataField="l_name"
                    SortExpression="שם משפחה">

                </asp:BoundField>


        </Columns>
    </asp:GridView>

cs:

 protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "MyRowButton")
        {
            string mem_id = e.CommandArgument.ToString();

            db.remove_member(mem_id, num);

            Response.Redirect("memberInevents.aspx?enum=" + num);

        }
    }
4

3 に答える 3

0

コントロール (ボタン) がグリッドビューの行内にある場合、そのイベントは通常のボタンの場合のようには発生しません。これは、イベント バブリングと呼ばれます。コントロールがコンテナ内にある場合、それらはそのコンテナの子になります。たとえば、あなたの場合、ボタンは gridview の子であり、その場合、子はイベントを直接発生させることはできません。彼らはイベントをコンテナ/親、つまりグリッドビューに送信します。その親、つまりグリッドビューのイベントを処理する必要があります。

グリッドビューの OnRowCommand イベントを使用してみてください。それは役立つはずです。「FindControl」メソッドを使用して、その行でボタン コントロールを見つけることができます。

お役に立てれば!さらにサポートが必要な場合はお知らせください。

于 2013-07-22T09:40:49.947 に答える
0

これがあなたのボタンだと思います

<ItemTemplate>
  <asp:Button ID="delete_mem" CommandArgument='<%# Bind("id") %>' runat="server" Text="הסר מאירוע" OnClick="remove_member" CssClass="btn btn-primary" />
</ItemTemplate>

次のように変更します。

 <ItemTemplate>
    <asp:Button ID="delete_mem" CommandArgument='<%# Eval("id") %>' runat="server" Text="הסר מאירוע" CommandName="remove_member" CssClass="btn btn-primary" />
 </ItemTemplate>

現在、gridviews の rowcomand イベントで

protectected void Gv_RowCommand(object sender, GridRowCommandEventArgs e)
{
   if(e.CommandName.Equals("remove_member"))
   {
        string mem_id = e.CommandArgument.ToString();

        db.remove_member(mem_id, num);


   }
   System.Thread.Sleep(500); // To hold the current thread for few second to complete the operation and then redirect to your desired page
    Response.Redirect("memberInevents.aspx?enum=" + num);
}

ここを参照してください 。古いコードです。

SqlDataSource2.SelectParameters["num"].DefaultValue = e_num;
        GridView1.DataSourceID = "SqlDataSource2";
        GridView1.DataBind();

        if (!IsPostBack)
        {
            List<string[]> ids_list = db.return_ids_for_event(Convert.ToInt32(e_num));

            foreach (string[] s in ids_list)
            {
                DropDownList1.Items.Add(new ListItem(s[0], s[1]));

            }
        }

新しいコード:

        SqlDataSource2.SelectParameters["num"].DefaultValue = e_num;

        if (!IsPostBack)
        {
        GridView1.DataSourceID = "SqlDataSource2";
        GridView1.DataBind();

            List<string[]> ids_list = db.return_ids_for_event(Convert.ToInt32(e_num));

            foreach (string[] s in ids_list)
            {
                DropDownList1.Items.Add(new ListItem(s[0], s[1]));

            }
        }

問題:

バインディングは !Ispostback 内にある必要があります

于 2013-07-22T10:25:20.440 に答える
0

ページ読み込みのすべてのコードを IsPostBack ブロックに入れます。

protected void Page_Load(object sender, EventArgs e)
{

    if (!IsPostBack)
    {

      string e_num = Request.QueryString["enum"];

      Label headline_lbl = new Label();
      headline_lbl.Text = db.return_event_name(e_num);
      headline_lbl.CssClass = "head_line";
      head_line_ph.Controls.Add(headline_lbl);

      SqlDataSource2.SelectParameters["num"].DefaultValue = e_num;
      GridView1.DataSourceID = "SqlDataSource2";
      GridView1.DataBind();

        List<string[]> ids_list = db.return_ids_for_event(Convert.ToInt32(e_num));

        foreach (string[] s in ids_list)
        {
            DropDownList1.Items.Add(new ListItem(s[0], s[1]));

        }
    }


}
于 2013-07-22T09:32:58.643 に答える