webForumDet fria alternativet

Mysko händelse i gridview

.NET

2 svar · 322 visningar · startad av Hyzac

Medlem sedan mars 200475 inlägg
Frågan#1

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
Medlem sedan mars 200475 inlägg
#2

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.

Medlem sedan mars 200475 inlägg
#3

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:

<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

276 ms totalt · 4 externa anrop · v20260731065814-full.2f471f9e
125 ms — deklarationer (db)
0 ms — hämta statistik (cache)
141 ms — hämta tråd, inlägg och bilagor (db)
131 ms — ändringar (db)