25 messaggi dal 27 luglio 2012
Scusate la sitassi del titolo. Non riesco a correggerla...
Sono in difficolta' con una gridview che ha datasource = datatable creato da code-behind. Direi che funziona tutto bene se non eseguo un ordinamento per colonna (cliccando sul titolo della stessa). Dopo questa operazione infatti mi perdo la corrispondenza tra il record della gridview e quello del datatable. In pratica faccio modifiche/cancellazioni sul record sbagliato. Posto un estratto del codice sperando che possiate aiutarmi. Il codice dell'ordinamento l'ho trovato sul forum msdn...

Protected Sub GridViewPeriodo_Sorting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewSortEventArgs) Handles GridViewPeriodo.Sorting

Dim dt = CType(Session("ACDTable"), DataTable)

If dt IsNot Nothing Then
'Sort the data.
dt.DefaultView.Sort = e.SortExpression & " " & GetSortDirection(e.SortExpression)
Session("ACDTable") = dt
Me.BindData()
End If

End Sub

Private Function GetSortDirection(ByVal column As String) As String

' By default, set the sort direction to ascending.
Dim sortDirection = "ASC"

' Retrieve the last column that was sorted.
Dim sortExpression = TryCast(ViewState("SortExpression"), String)

If sortExpression IsNot Nothing Then
' Check if the same column is being sorted.
' Otherwise, the default value can be returned.
If sortExpression = column Then
Dim lastDirection = TryCast(ViewState("SortDirection"), String)
If lastDirection IsNot Nothing _
AndAlso lastDirection = "ASC" Then
sortDirection = "DESC"
End If
End If
End If

' Save new values in ViewState.
ViewState("SortDirection") = sortDirection
ViewState("SortExpression") = column

Return sortDirection

End Function

Private Sub BindData()

GridViewPeriodo.DataSource = CType(Session("ACDTable"), DataTable)
GridViewPeriodo.DataBind()

End Sub

PARTE ASP:
<asp:GridView ID="GridViewPeriodo" runat="server" AutoGenerateColumns="False"
AllowSorting="True"
width="1000px"
DataKeyNames="ID"
AllowPaging="True" PageSize="15"
CellPadding="4"
CssClass="GridViewDati"
ShowHeader="true"
ShowFooter="True"
onrowcommand="GridViewPeriodo_RowCommand"
AlternatingRowStyle-CssClass="Alternate"
PagerStyle-CssClass="Pager">

<Columns>
<asp:BoundField DataField="ID" HeaderText="ID" InsertVisible="False"
ReadOnly="True" SortExpression="ID" visible="false"/>
<asp:TemplateField HeaderText="<%$ Resources:Anag_cutoff_date, etiSocieta %>" SortExpression="DES_ENTERPRISE" HeaderStyle-HorizontalAlign="Center" ItemStyle-HorizontalAlign="Center" >
<EditItemTemplate>
<asp:DropDownList ID="ddlSocieta" runat="server" AppendDataBoundItems="false" DataSourceID = "SqlDataSourceSocieta" Enabled="true"
DataTextField="DESCRIPTION" DataValueField="ENTERPRISE" AutoPostBack="false" SelectedValue='<%# Bind("ENTERPRISE") %>' >
</asp:DropDownList>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="lblEnterprise" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "DES_ENTERPRISE") %>' ></asp:Label>
</ItemTemplate>
<FooterTemplate>
<asp:DropDownList ID="ddlSocieta" runat="server" AppendDataBoundItems="true" Enabled="true"
DataTextField="DESCRIPTION" DataValueField="ENTERPRISE" AutoPostBack="false" >
<asp:ListItem Value=""></asp:ListItem>
</asp:DropDownList>
</FooterTemplate>
</asp:TemplateField>

<asp:TemplateField HeaderText="<%$ Resources:Anag_cutoff_date, etiModello %>" SortExpression="DES_MODEL" HeaderStyle-HorizontalAlign="Center" ItemStyle-HorizontalAlign="Center" >
<EditItemTemplate>
<asp:DropDownList ID="ddlModel" runat="server" AppendDataBoundItems="false" DataSourceID = "SqlDataSourceModel" width="280px" Enabled="true"
DataTextField="DESCRIPTION" DataValueField="MODELS" AutoPostBack="false" SelectedValue='<%# Bind(,"MODEL") %>' >
</asp:DropDownList>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="lblModello" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "DES_MODEL") %>' ></asp:Label>
</ItemTemplate>
<FooterTemplate>
<asp:DropDownList ID="ddlModel" runat="server" AppendDataBoundItems="true" width="280px" Enabled="true"
DataTextField="DESCRIPTION" DataValueField="MODELS" AutoPostBack="false">
<asp:ListItem Value=""></asp:ListItem>
</asp:DropDownList>
</FooterTemplate>
</asp:TemplateField>

<asp:TemplateField HeaderText="<%$ Resources:Anag_cutoff_date, etiOggetto %>" SortExpression="DES_OBJECT" HeaderStyle-HorizontalAlign="Center" ItemStyle-HorizontalAlign="Center" >
<EditItemTemplate>
<asp:DropDownList ID="ddlObject" runat="server" AppendDataBoundItems="false" DataSourceID = "SqlDataSourceObject" width="280px" Enabled="true"
DataTextField="OBJECT_DESCRIPTION" DataValueField="OBJECT_NAME" AutoPostBack="false" SelectedValue='<%# Bind(,"OBJECT_NAME") %>' >
</asp:DropDownList>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="lblOggetto" runat="server" Text='<%# Bind(,"DES_OBJECT") %>' ></asp:Label>
</ItemTemplate>
<FooterTemplate>
<asp:DropDownList ID="ddlObject" runat="server" AppendDataBoundItems="true" width="280px" Enabled="true"
DataTextField="OBJECT_DESCRIPTION" DataValueField="OBJECT_NAME" AutoPostBack="false">
<asp:ListItem Value=""></asp:ListItem>
</asp:DropDownList>
</FooterTemplate>
</asp:TemplateField>

<asp:TemplateField HeaderText="<%$ Resources:Anag_cutoff_date, etiData %>" SortExpression="REAL_CUTOFF_DATE" >
<EditItemTemplate>
<asp:TextBox ID="txtData" runat="server" Text='<%# Bind("CUTOFF_DATE") %>' width="90px"></asp:TextBox>
<ajaxToolkit:CalendarExtender ID="CalendarExtender1"
runat="server"
format="dd/MM/yyyy"
TargetControlID="txtData"/>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="lblData" runat="server" Text='<%# Bind("CUTOFF_DATE") %>' width="90px"></asp:Label>
</ItemTemplate>
<FooterTemplate>
<asp:TextBox ID="txtDataFt" runat="server" width="90px"/>
<ajaxToolkit:CalendarExtender ID="CalendarExtender2"
runat="server"
format="dd/MM/yyyy"
TargetControlID="txtDataFt"/>
</FooterTemplate>
</asp:TemplateField>

<asp:TemplateField HeaderText="<%$ Resources:Anag_cutoff_date, etiNote %>" SortExpression="JOB_NOTE" >
<EditItemTemplate>
<asp:TextBox ID="txtNote" runat="server" Text='<%# Bind("NOTE") %>' ></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="lblNote" runat="server" Text='<%# Bind("NOTE") %>' ></asp:Label>
</ItemTemplate>
<FooterTemplate>
<asp:TextBox ID="txtNoteFt" runat="server" />
</FooterTemplate>
</asp:TemplateField>

<asp:TemplateField ShowHeader="False" HeaderText="<%$ Resources:Anag_cutoff_date, etiAzione %>">
<ItemTemplate>
<asp:ImageButton ID="Button2" runat="server"
OnClientClick="return confirm('Cancellare definitivamente la voce selezionata?');"
CausesValidation="false" CommandName="delete" ImageUrl="~/images/cestino16.png" />
</ItemTemplate>
<ItemStyle HorizontalAlign="Center" />

<FooterTemplate>
<asp:ImageButton ID="ibInsert" runat="server"
CommandName="Insert" ImageUrl="~/images/Piu16.png" />
</FooterTemplate>
</asp:TemplateField>

<asp:CommandField ShowEditButton="True"
ItemStyle-HorizontalAlign="Center"
HeaderStyle-HorizontalAlign="Center"
buttontype="Image"
editimageurl="~/Images/Opzioni16.png"
cancelimageurl="~/Images/Chiudi16.png"
updateimageurl="~/Images/Conferma16.png"
headertext="<%$ Resources:Anag_cutoff_date, etiModifica %>"/>

</Columns>
</asp:GridView>
Modificato da domleg il 28 maggio 2013 21.07 -
Innanzitutto mi chiedo come mai hai il datatable in sessione (ricaricalo dal db quando ti serve).

Potresti ridurre il codice che hai postato al minimo indispensabile (penso che una colonna sia sufficiente) e mantenendo solo la cancellazione come caso? Inoltre manca il datasource.

Ormai programmano tutti... ma la professionalità appartiene a pochi
25 messaggi dal 27 luglio 2012
Grazie per la risposta.
In effetti sono alle prime armi e sicuramente ho impostato la cosa nel modo sbagliato.
Pensavo di tenere il dt in sessione per non ricaricarlo ogni volta.
Adesso dopo il tuo suggerimento lo ricarico all'occorrenza eliminando ovviamente il problema di corrispondenza tra i due e con poche modifiche al resto del codice, pare che tutto funzioni.
Grazie ancora per l'imbeccata.

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.