Penyortiran GridView dengan ImageButtons dan Delete Command tidak berfungsi

Saya memiliki kontrol GridView yang memiliki 5 bidang terikat yang mengaktifkan pengurutan dan 4 bidang templat. Salah satu kolom template adalah tombol Hapus Gambar yang menghapus baris saat diklik. Sekarang, semuanya baik-baik saja ketika pengguna hanya menggunakan tampilan grid apa adanya, tanpa mengurutkannya. Namun ketika mereka mengurutkannya dan kemudian menekan hapus, argumen perintah menerima informasi baris yang salah dan menghapusnya alih-alih menghapus apa yang mereka pilih untuk dihapus. Ini hanya terjadi pada 2 bidang templat yang memiliki kontrol tombol gambar.

<Columns>
        <asp:BoundField DataField="AccountNo" HeaderText="Account No" 
            SortExpression="AccountNo" />
        <asp:BoundField DataField="Address" HeaderText="Address" 
            SortExpression="Address" />
        <asp:BoundField DataField="City" HeaderText="City" SortExpression="City" />
        <asp:BoundField DataField="Name" HeaderText="Name" 
            SortExpression="Name" />
        <asp:BoundField DataField="State" HeaderText="State" SortExpression="State" />
        <asp:BoundField DataField="Zip" HeaderText="Zip" SortExpression="Zip" />
        <asp:BoundField DataField="Utility" HeaderText="Utility" 
            SortExpression="Utility" />                
        <asp:TemplateField HeaderText="Edit">
            <ItemTemplate>
                <asp:HyperLink runat="server" ID="EditLink"  ToolTip="Edit Account" NavigateUrl='<%# GetEditURL(((BillingEntity)Container.DataItem).Id) %>' >
                    <img src="../img/edit.png" border="0"/>
                </asp:HyperLink>
            </ItemTemplate>
            <ItemStyle HorizontalAlign="Center"></ItemStyle>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Enable/Disable" >
            <ItemTemplate>
                <asp:ImageButton runat="server" ID="DisableButton" ImageUrl = "../img/delete.png" ToolTip="Disable Account" CommandName="Disable_Account" CommandArgument='<%#((BillingEntity)Container.DataItem).Id %>' OnClientClick="if (confirm('Are you sure you want to disable this account?')==false) {return false;}" Visible='<%# ShowDisableButton(((BillingEntity)Container.DataItem).Status)%>'/>
                <asp:ImageButton runat="server" ID="EnableButton" ImageUrl = "../img/add.png" ToolTip="Enable Account" CommandName="Enable_Account" CommandArgument='<%#((BillingEntity)Container.DataItem).Id %>'   Visible='<%# ShowEnableButton(((BillingEntity)Container.DataItem).Status)%>'/>                    
            </ItemTemplate>                
            <ItemStyle HorizontalAlign="Center"></ItemStyle>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Delete" >
            <ItemTemplate>
                <asp:ImageButton runat="server" ID="Delete" ImageUrl = "../img/cross.png" ToolTip="Delete Account" CommandName="Delete_Account" CommandArgument='<%#((BillingEntity)Container.DataItem).Id %>' OnClientClick="if (confirm('Invoices associated with this account will be deleted permanently. Are you sure you want to delete this account?')==false) {return false;}" />
            </ItemTemplate>                
            <ItemStyle HorizontalAlign="Center"></ItemStyle>
        </asp:TemplateField>            
       <asp:TemplateField HeaderText="View Invoices" ItemStyle-HorizontalAlign="Center">
            <ItemTemplate>
                <asp:HyperLink runat="server" ID="ViewInvoiceLink" ToolTip="Recent invoices" NavigateUrl='<%# GetViewInvoiceURL(((BillingEntity)Container.DataItem).Id) %>' >
                    <img src="../img/go.png" border="0"/>
                </asp:HyperLink>
            </ItemTemplate>

            <ItemStyle HorizontalAlign="Center"></ItemStyle>
        </asp:TemplateField>            
       <asp:TemplateField HeaderText="Submit Invoice" ItemStyle-HorizontalAlign="Center">
            <ItemTemplate>
                <asp:HyperLink runat="server" ID="InvoiceLink"  ToolTip="Submit invoice" NavigateUrl='<%# GetSubmitInvoiceURL(((BillingEntity)Container.DataItem).Id) %>' >
                    <img src="../img/go.png" border="0"/>
                </asp:HyperLink>
            </ItemTemplate>

            <ItemStyle HorizontalAlign="Center"></ItemStyle>
        </asp:TemplateField>
</Columns>

EDIT-Kode Sumber Data

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" 
    SelectMethod="GetAllEntities" 
    TypeName="DataAccessLayer.Repository.BillingEntityRepository">
    <SelectParameters>
        <asp:QueryStringParameter DefaultValue="-1" Name="clientId" 
            QueryStringField="clientId" Type="Int32" />
        <asp:Parameter DefaultValue="Name" Name="sortColumn" Type="String" />
        <asp:Parameter DefaultValue="ASC" Name="sortOrder" Type="String" />
    </SelectParameters>
</asp:ObjectDataSource>

Dan metode GridView Sort saya adalah sebagai berikut:

protected void GridView_BillingEntity_Sorting(object sender, GridViewSortEventArgs e)
{
    if (ObjectDataSource1.SelectParameters.Count == 3)
    {
        ObjectDataSource1.SelectParameters[1].DefaultValue = e.SortExpression.ToString();
        ObjectDataSource1.SelectParameters[2].DefaultValue = GetSortDirection(e.SortExpression);

        GridView_BillingEntity.DataBind();

        e.Cancel = true;
    }
}

EDIT-Baris seperti yang dilihat oleh pengguna

Ini adalah cara pengguna melihat baris di browser. Mengklik tombol hapus akan menghapus baris dan menyegarkan grid.


person Sai    schedule 03.04.2014    source sumber
comment
Di acara _Sorting Anda, apa yang Anda ikat Gridview? Saya tidak dapat melihat DataSource sedang disetel.   -  person Martin Smellworse    schedule 03.04.2014
comment
@MartinSmellworse: Saya telah mengedit postingan saya untuk menyertakan Sumber Data.   -  person Sai    schedule 03.04.2014
comment
Anda mengatakan apa yang mereka pilih untuk dihapus? Bagaimana cara mereka memilih satu baris? apakah ada tombol pilih atau ada cara lain?   -  person R.C    schedule 04.04.2014
comment
@FlopScientist: Menambahkan gambar untuk menunjukkan bagaimana pengguna dapat memilih untuk menghapus satu baris. Dalam contoh ini, saya punya satu baris. Ketika ada beberapa baris dan saya mengurutkan berdasarkan salah satu dari 6 kolom pertama dan menekan hapus pada satu baris. Baris acak yang berbeda dari yang saya pilih akan dihapus.   -  person Sai    schedule 04.04.2014
comment
Apa yang terjadi jika Anda menampilkan Argumen Perintah dari ImageButton yang melakukan penghapusan pada label di sel yang sama? Apakah nilainya tetap tepat saat Anda mengurutkan? Saya belum pernah melihat GridView terikat seperti yang Anda lakukan. Saya selalu menggunakan DataSet - simpan di ViewState jika tidak terlalu besar dan ubah SortOrder dari DataSet sebelum penyatuan data pada setiap jenis.   -  person Martin Smellworse    schedule 04.04.2014
comment
Mungkin ada sedikit kesalahan pada kode saat Anda memeriksa CommandName untuk mengambil tindakan yang sesuai seperti: Hapus_Akun   -  person R.C    schedule 04.04.2014
comment
@MartinSmellworse: Ya, menariknya jenis ini mempertahankan Nilai CommandArgument. Tetapi ketika saya melakukan debug melalui kode handler saya setelah menekan delete, argumen perintah yang diteruskan bukanlah yang ada di label!   -  person Sai    schedule 04.04.2014
comment
Tepatnya. Itu sama dengan nilai argumen perintah yang ada di baris itu sebelum diurutkan.   -  person Sai    schedule 04.04.2014
comment
Bagi saya sepertinya Anda mungkin mengikat grid dua kali. Sekali setiap kali Anda melakukan postback dan sekali saat Anda mengurutkan. Jika penghapusan Anda terjadi di antara dua kumpulan data tersebut, hal ini akan menjelaskan mengapa ia mengambil ID 'terakhir'. Sunting. Saya melihat orang lain telah memberikan saran yang sama.   -  person Martin Smellworse    schedule 04.04.2014


Jawaban (1)


Saat mengklik tombol Hapus, Pemuatan Halaman terjadi sebelum kode pengendali Hapus Anda. Jadi jika Anda mengikat GridView di acara page_load, Anda harus mengikat dalam kondisi !IsPostBack:

if (!IsPostBack)
{
    GridView1.DataSource = MyDataSource;
    GridView1.DataBind();
}

Karena jika Anda mengikat GridView setiap kali, data akan dimuat lagi, yaitu GridView diisi ulang dengan data yang belum disortir, sehingga kehilangan urutan pengurutan sebelumnya.

person R.C    schedule 03.04.2014