ASP.net Gridview .. что-то странное - PullRequest
0 голосов
/ 03 августа 2011

У меня есть сетка, и я использую сеанс для передачи переменных со страницы на страницу редактирования. Это работает отлично, пока вы не ищете номер. При поиске правильной записи отображается в виде сетки, но когда вы нажимаете кнопку Изменить, она передает неправильную запись.

Private Sub gridview1_RowEditing(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewEditEventArgs) Handles GridView1.RowEditing
    Session("wr_id") = GridView1.Rows(e.NewEditIndex).Cells(2).Text & "~\/~" & _
                GridView1.Rows(e.NewEditIndex).Cells(3).Text & "~\/~" & _
                GridView1.Rows(e.NewEditIndex).Cells(4).Text & "~\/~" & _
                GridView1.Rows(e.NewEditIndex).Cells(5).Text & "~\/~" & _
                GridView1.Rows(e.NewEditIndex).Cells(6).Text & "~\/~" & _
                GridView1.Rows(e.NewEditIndex).Cells(7).Text & "~\/~" & _
                GridView1.Rows(e.NewEditIndex).Cells(8).Text & "~\/~" & _
                GridView1.Rows(e.NewEditIndex).Cells(9).Text & "~\/~" & _
                GridView1.Rows(e.NewEditIndex).Cells(10).Text & "~\/~" 
                Response.Redirect("WorkEdit.aspx")
End Sub

Страница GRIDVIEW

Protected Sub btnSubmit_Click(sender As Object, e As System.EventArgs) Handles btnSubmit.Click
    Dim strPost As Boolean = HiddenSearch.Value
    If strPost = True Then
        Dim strNumber As String
        Dim Dropdown As String
        strNumber = Search_text.Text
        Dropdown = Search_Field.SelectedValue
        If Dropdown = "WO#" Then
            Convert.ToInt32(strNumber)
        End If
        Try
            SqlDataSource1.SelectCommand = "SELECT * FROM [WorkOrderLog] WHERE " + Dropdown + " = '" + strNumber + "' ORDER BY [WO#] DESC"
            SqlDataSource1.Select(DataSourceSelectArguments.Empty)
            SqlDataSource1.DataBind()
            GridView1.DataBind()
        Catch
            'output messagebox for debug
            Dim strPrompt As String
            strPrompt = "Something bad happened, check search text and try again."
            Dim strScript As String = "<script language=JavaScript>"
            strScript += "alert(' " & strPrompt & "');"
            strScript += "</script>"
            Search_text.Focus()
        End Try
    Else
        Search_text.Focus()
    End If


End Sub

WORDEDIT Page

Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load
    'change submit button on mouseover events
    Submit_Button.Attributes.Add("onmouseover", "this.src='../images/Submitdown.png'")
    Submit_Button.Attributes.Add("onmouseout", "this.src='../images/Submitup.png'")
    'change clear button on mouseover events
    Clear.Attributes.Add("onmouseover", "this.src='../images/Cancel(down).png'")
    Clear.Attributes.Add("onmouseout", "this.src='../images/Cancel(up).png'")
    Call Keypress_ALegal()
    Call Keypress_ASite()
    errorWOName.Text = HiddenWOName.Value
    errorLegalDesc.Text = HiddenLegalDesc.Value
    errorLocationNumber.Text = HiddenLocationNumber.Value
    errorDesc.Text = HiddenDesc.Value
    errorSiteNumber.Text = HiddenSiteNumber.Value

    If Not Page.IsPostBack Then

        'Get session info
        lblID.Text = "Session Variable Was Lost"
        If (Session("wr_id") <> "") Then
            Dim strSession As String = Session("wr_id")
            Dim sessionArray As Array
            'split session into array at ~\/~ 
            sessionArray = Split(Session("wr_id"), "~\/~")
            'assign textbox/dropdowns values passed from split variables
            lblID.Text = sessionArray(0)
            'WO Name
            If sessionArray(1) = "&nbsp;" Then
                WOName.Text = ""
            Else
                WOName.Text = sessionArray(1)
            End If
            Location.Text = sessionArray(2)
            'LegalDesc
            If sessionArray(3) = "&nbsp;" Then
                LegalDesc.Text = ""
            Else
                LegalDesc.Text = sessionArray(3)
            End If
            'Trans ADDED
            If sessionArray(4) = "&nbsp;" Then
                TransADDED.Text = ""
            Else
                TransADDED.Text = sessionArray(4)
            End If
            'Trans Retired
            If sessionArray(5) = "&nbsp;" Then
                TransRETIRED.Text = ""
            Else
                TransRETIRED.Text = sessionArray(5)
            End If
            If sessionArray(6) = "&nbsp;" Then
                Description.Text = ""
            Else
                Description.Text = sessionArray(6)
            End If
            If sessionArray(7) = "1/1/1900 12:00:00 AM" Or sessionArray(7) = "&nbsp;" Then
                Started.Text = ""
            Else
                Started.Text = (CType((sessionArray(7)), DateTime).ToString("MM/dd/yyyy HH:mm tt"))
            End If
            If sessionArray(8) = "1/1/1900 12:00:00 AM" Or sessionArray(8) = "&nbsp;" Then
                Completed.Text = ""
            ElseIf sessionArray(8) = "&nbsp;" Then
                Completed.Text = ""
            Else
                Completed.Text = (CType((sessionArray(8)), DateTime).ToString("MM/dd/yyyy HH:mm tt"))
            End If
            StakedBy.SelectedValue = sessionArray(9)

Я понимаю, что не весь код вставлен сюда, потому что он занял бы слишком много места. Есть идеи? Я предполагаю, что это как-то связано с e.NewEditIndex

Ответы [ 2 ]

0 голосов
/ 04 августа 2011

Решением проблемы было завершение загрузки страницы в операторе if, ispostback. Спасибо за вашу помощь rkw.

   Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load
    If IsPostBack Then
        If Search_text.Text = "" Then
            SqlDataSource1.SelectCommand = "SELECT * FROM [WorkOrderLog] ORDER BY [WO#] DESC"
            SqlDataSource1.Select(DataSourceSelectArguments.Empty)
            SqlDataSource1.DataBind()
            GridView1.DataBind()
        Else
        End If
    End If
        If Not IsPostBack Then
            SqlDataSource1.SelectCommand = "SELECT * FROM [WorkOrderLog] ORDER BY [WO#] DESC"
            SqlDataSource1.Select(DataSourceSelectArguments.Empty)
            SqlDataSource1.DataBind()
            GridView1.DataBind()
        End If
End Sub
0 голосов
/ 03 августа 2011

Ваш код выглядит нормально.Является ли Session ("wr_id") фактическим кодом или это код макета "wr_id"?

Причина, по которой я спрашиваю, заключается в том, что к значениям сеанса можно получить доступ либо по строке, либо по индексу.

  • Session («id») будет обращаться к переменной сеанса с помощью ключа «id»
  • Session (8) будет обращаться к 9-му элементу в сеансе

Еслиу вас есть код, использующий Session(selectedID), а selectedID - это заполненная переменная object, вы измените способ доступа к переменным сеанса в зависимости от того, является ли selectedID числом или строкой

Обновление :

Посмотрите, связываетесь ли вы где-нибудь еще в своем коде (например, в своем событии Page_Load).Вероятность повторного связывания сетки с новыми данными существует до того, как может произойти событие редактирования элемента управления

...