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å?
Här kommer koden:
i aspx.vb-filen
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
i banner.vb
Public Sub Move(ByVal id As Integer, ByVal direction As String)
bannerDB.Move(id, direction)
End Sub
i bannerDB.vb
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
och sproc för nedflyttning som exempel
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
Efter att ha djupgranska körningen av all kod så har jag upptäckt att intOrder uppdateras efter denna kodrad:
If e.CommandName = "Up" Or e.CommandName = "Down" Or e.CommandName = "First" Or e.CommandName = "Last" Then
Varför gör den det, det är ju bara en enkel if-sats????? Fårgan är ju hur också, för stegar jag igenom körningen så kör den ju inget annat än nästa rad som nästa steg.
Tydligen så är det ett känt problem hos microsoft om man använder en buttoncolumn av type image i en gridview. Då blir det nån form av dubbelpostning.
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: