Jag har en gridview som sorteras efter ett kolumnvärde som heter intOrder. I gridviewen har jag buttonfields som kan flytta vald post upp och ner. Kör jag sproc:en som hanterar detta så flyttas allt som det ska ett steg, men kör jag det från webben så verkar det köras två steg ochh vald rad flyttas ner två steg. Vad beror detta på? Tydligen så är detta ett problem som microsoft har då man använder en buttoncolumn med typen image.Mysko körning i gridview
Här kommer koden:
i aspx.vb-filen
Kod:
<code>
Protected Sub GridView1_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs) Handles GridView1.RowCommand
If e.CommandName = "Up" Or e.CommandName = "Down" Or e.CommandName = "First" Or e.CommandName = "Last" Then
Dim index As Integer = Convert.ToInt32(e.CommandArgument)
Dim selectedRow As GridViewRow = GridView1.Rows(index)
Dim idCell As TableCell = selectedRow.Cells(0)
Dim intId As Integer = Convert.ToInt32(idCell.Text)
Dim mBanner As New banner()
mBanner.Move(intId, e.CommandName.ToString)
GridView1.DataBind()
End If
End Sub
</code>
i banner.vb
Kod:
<code>
Public Sub Move(ByVal id As Integer, ByVal direction As String)
bannerDB.Move(id, direction)
End Sub
</code>
i bannerDB.vb
Kod:
<code>
Public Shared Sub Move(ByVal id As Integer, ByVal direction As String)
Try
Using conn As New SqlConnection(config.ConnectionString)
Dim cmd As SqlCommand = New SqlCommand("tblBannerMove" & direction, conn)
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.AddWithValue("@intBannerId", id)
conn.Open()
cmd.ExecuteNonQuery()
conn.Close()
cmd.Dispose()
End Using
Catch ex As Exception
Throw
End Try
End Sub
</code>
och sproc för nedflyttning som exempel
Kod:
<code>
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
DECLARE @localPosition int
DECLARE @ProjectId int
SET @ProjectId = (SELECT intProjectId FROM tblBanner WHERE intBannerId = @intBannerId)
SET @localPosition = (SELECT intOrder FROM tblBanner WHERE intBannerId = @intBannerId)
IF @localposition < ((SELECT COUNT(intBannerId) FROM tblBanner WHERE intProjectId = @ProjectId)-1)
BEGIN
UPDATE tblBanner SET intOrder = @localPosition
WHERE intOrder = (@localPosition +1) AND intProjectId = @ProjectId
UPDATE tblBanner SET intOrder = (@localPosition +1)
WHERE intBannerId = @intBannerId
END
END
</code>
Efter att ha granskat körningen av koden och samtidigt följt eventuell uppdatering av databasen har jag kommit fram till att en uppdatering av intOrder sker efter denna rad:
<code>
If e.CommandName = "Up" Or e.CommandName = "Down" Or e.CommandName = "First" Or e.CommandName = "Last" Then
</code>
Varför och hur kan den göra det? Har även upptäckt att, om jag efter att denna rad körts och raden blivit uppdaterad en gång, stoppar körningen så uppdateras raden trots det en gång till och posten har då flyttats två steg. Är det nåt som körs i bakgrunden som man inte ser i debugläget eller vad är det som pågår?
Uppdatering
Det här blir bara konstigare och konstigare.
om jag sätter en breakpoint på denna raden
<code>
Protected Sub GridView1_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs) Handles GridView1.RowCommand
</code>
trycker på F11 för att gå vidare så kan den ibland stanna på denna raden tills jag trycker F11 igen då den går vidare och ibland går den vidare direkt. Har den gått vidare till nästa rad direkt
<code>
If e.CommandName = "Up" Or e.CommandName = "Down" Or e.CommandName = "First" Or e.CommandName = "Last" Then
</code>
så går den oftast tillbaka till första raden igen vid nästa tryck på F11 och då har en uppdatering av databasen skett. Annars sker en uppdatering av databasen när men går från den andra raden. Helmystiskt beteende som jag gärna skulle vilja ha en förklaring på. Gör jag nåt fel eller vad är det?Sv: Mysko körning i gridview
This bug has been forwarded to Microsoft.
This is the answer from Microsoft Bug adn reported issues:
Thanks for reporting the issue. This is a known issue and we are
investigating fixing this in the next service pack. For the time being
you could use the following work around. One obvious workaround is to
change the button type to a regular button or a link button. If you need
an ImageButton, then you can put an ImageButton in a TemplateField. You
may need to handle the Command event on the ImageButton and call
DeleteRow, passing the RowIndex as the CommandArgument, like this:
<asp:GridView ID="GridView1" runat="server">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:ImageButton runat=server id="ImageButton1" CommandName="Delete"
ImageUrl="..." CommandArgument='<%# DataBinder.Eval(Container,
"RowIndex") %>' OnCommand="ImageButton1_Command" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
protected void ImageButton1_Command(object sender, CommandEventArgs e) {
GridView1.DeleteRow(Int32.Parse(e.CommandArgument. ToString()));
}
Thanks,
The Web Platform and Tools Team