2

次のマークアップを含む GridView コントロールがあります。

 <asp:GridView ID="gvGroups" runat="server" Width="100%" AutoGenerateColumns="False"
            ShowFooter="True" BorderColor="White" BorderStyle="Ridge" CellSpacing="1" BorderWidth="2px"
            BackColor="White" CellPadding="3" GridLines="None" Font-Names="Tahoma" Font-Size="11px"
            DataKeyNames="GroupId" OnRowDeleting="gvGroups_RowDeleting">
            <FooterStyle BackColor="#C6C3C6" ForeColor="Black" />
            <RowStyle BackColor="#DEDFDE" ForeColor="Black" />
            <HeaderStyle BackColor="#4A3C8C" Font-Bold="True" ForeColor="#E7E7FF" />
            <Columns>
                <asp:TemplateField HeaderText="Row">
                    <ItemTemplate>
                        <asp:Literal ID="litRowNumberNormal" runat="server"></asp:Literal>
                    </ItemTemplate>
                    <FooterTemplate>
                        <asp:Literal ID="litRowNumberFooter" runat="server"></asp:Literal>
                    </FooterTemplate>
                    <ItemStyle HorizontalAlign="Center" />
                    <FooterStyle HorizontalAlign="Center" />
                </asp:TemplateField>
                <asp:TemplateField HeaderText="Title">
                    <ItemTemplate>
                        <%#Eval("Title")%>
                    </ItemTemplate>
                    <FooterTemplate>
                        <asp:TextBox ID="txtAddTitle" runat="Server" BorderStyle="Solid" BorderWidth="1px"
                            Font-Names="Tahoma" Font-Size="11px" BorderColor="Black" />
                    </FooterTemplate>
                    <EditItemTemplate>
                        <asp:TextBox ID="txtEditTitle" Text='<%# Bind("Title") %>' runat="server" BorderStyle="Solid"
                            BorderWidth="1px" Font-Names="Tahoma" Font-Size="11px" BorderColor="Black" />
                    </EditItemTemplate>
                </asp:TemplateField>
                <asp:CommandField ShowEditButton="True" ButtonType="Button" UpdateText="Save" CancelText="Cancel"
                    EditText="Edit" HeaderText="Edit">
                    <FooterStyle BackColor="#669900" HorizontalAlign="Center" />
                    <HeaderStyle BackColor="#5A49A7" HorizontalAlign="Center" />
                    <ItemStyle BackColor="#FFC080" HorizontalAlign="Center" />
                </asp:CommandField>
                <asp:TemplateField HeaderText="Delete">
                    <FooterTemplate>
                        <asp:Button CommandName="Delete" Text="Delete" ID="btnRemove" runat="server" BorderStyle="Solid"
                            BorderWidth="1px" BackColor="#FFC080" Font-Names="Tahoma" Font-Size="11px" />
                    </FooterTemplate>
                    <ItemTemplate>
                        <asp:CheckBox ID="ChkRemove" runat="server"></asp:CheckBox>
                    </ItemTemplate>
                    <ItemStyle BackColor="LightCoral" HorizontalAlign="Center" />
                    <HeaderStyle BackColor="#5A49A7" HorizontalAlign="Center" />
                    <FooterStyle BackColor="#669900" HorizontalAlign="Center" />
                </asp:TemplateField>
            </Columns>
        </asp:GridView>

このグリッドのモデルは Group クラスの List です。グループクラスは以下の通りです。

public class Group
{
 public int GroupId {get; set; }
 public string Title {get; set; }
}

GroupId は私のテーブルの主キーです。[削除] ボタンを押すと、次のエラーが表示されます。

インデックスが範囲外でした。負ではなく、コレクションのサイズより小さくなければなりません。
パラメータ名:インデックス

私の RowDeleting イベント ハンドラ コード:

protected void gvGroups_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
    CheckBox chkRemove;

    List<int> ids = new List<int>();


    foreach (GridViewRow gvRow in gvGroups.Rows)
    {
        chkRemove = (CheckBox)gvRow.FindControl("ChkRemove");
        if (chkRemove.Checked)
        {
            ids.Add(Int32.Parse(gvGroups.DataKeys[gvRow.RowIndex].Value.ToString()));
        }
    }

    if (ids.Any())
    {
        GroupService.DeleteGroupById(ids);
    }

    this.BindGroups();
}
4

3 に答える 3

1

もう 1 つの作業として、"Delete" ボタンの CommandName プロパティを "Delete" 以外に変更し、それを RowCommand イベントで処理します。"Delete" コマンドは、GridView コントロールの RowDeleting イベントを発生させるためのデフォルトの CommandName です。

于 2012-11-06T03:35:42.103 に答える
0

複数削除を行う場合は、グリッドビューの外側に複数削除と呼ばれるボタンを追加し、onclickイベントを処理します。イベントハンドラーで、以下のように選択されたアイテムの数を削除します。

public void DeleteEverything(object sender, EventArgs e)
    {
        // this function is to delete the selected items based on the checkbox
        CheckBox chkAll = (CheckBox)GridView1.HeaderRow.FindControl("SelectAllCheck");
        // to get the Checkbox status in the header rows
        if (chkAll.Checked == true)
        {
            int i = 0;
            foreach (GridViewRow gvRow in GridView1.Rows)//to get all rows in that particular page
            {
                string Delete = Convert.ToString(GridView1.Rows[i].Cells[3].Text);
                //Cells[3] is the column to get one by one rows cells[3] columns where you should keep your primary keys and in visible state
                Bal_add.Delete(Delete);
                i++;
            }
            Response.Redirect("Information.aspx");
        }
        else
        {
            int j=0;
            foreach (GridViewRow gvRow in GridView1.Rows)
            {
                CheckBox chkSel = (CheckBox)gvRow.FindControl("SelectCheck");
                if (chkSel.Checked == true)
                {
                    string Delete = Convert.ToString(GridView1.Rows[j].Cells[3].Text);
                    //Cells[3] is the column to get one by one rows cells[3] columns where you should keep your primary keys and in visible state
                    Delete(Delete);

                }
                j++;

            }
            Response.Redirect("Information.aspx");
        }

    }

public void Delete(string UserEmail)
        {
            obj_add = new add();
            string QueryString;
            QueryString = System.Configuration.ConfigurationManager.ConnectionStrings["Admin_raghuConnectionString1"].ToString();

            obj_SqlConnection = new SqlConnection(QueryString);

            obj_SqlCommand = new SqlCommand("usp_DeleteDataProcedure");
            obj_SqlCommand.CommandType = CommandType.StoredProcedure;
            obj_SqlConnection.Open();

            obj_SqlCommand.Parameters.AddWithValue("@UserEmail", UserEmail);//here @UserName is the variable that we declare in the stored procedure
            obj_SqlCommand.Connection = obj_SqlConnection;
            SqlDataReader obj_result = null;

            obj_SqlCommand.CommandText = "usp_DeleteDataProcedure";
            obj_result = obj_SqlCommand.ExecuteReader();
            obj_SqlConnection.Close();

        }

ストアドプロシージャの主キーに従って削除できますこれがお役に立てば幸いです:D

于 2012-11-05T04:55:37.007 に答える
0

コードは正しいように見えますが、選択されたイベントは正しくありません。@AVD が言及したように、 RowDeletingイベントは、それぞれが独自のper row状況に対応しています。rowDelete button

行の [削除] ボタンがクリックされたときに、GridView コントロールが行を削除する前に発生します。

必要なのは、btnRemove_Clickイベントを追加してそこにコードを配置することだけです。

于 2012-11-05T04:51:59.863 に答える