簡體   English   中英

使用VB.Net使用SqlDatasource編輯Gridview w / o

[英]Editing a Gridview w/o using an SqlDatasource using VB.Net

我開發了以下代碼來編輯GridView(按照C#編寫的教程進行),它進入了編輯模式,但是我的編輯沒有生效,這是我的代碼:

aspx.vb代碼:

Imports System.Data
Imports System.Data.SqlClient
Imports System.Globalization

Partial Class MemberPages_editOutage
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
        If Not IsPostBack Then
            BindGrid()
        End If
    End Sub

    Private Sub BindGrid()
        Dim dt As New DataTable()
        Dim connection As New SqlConnection("server='\SQLEXPRESS'; trusted_connection='true'; Database='OutagesMgt_db'")
        Try
            connection.Open()
            Dim sqlStatement As String = "SELECT OutageDetailId, LocationName, Description, DetailDescription, CreateDate, StatusId FROM OutageDetail WHERE StatusId='1' ORDER BY CreateDate DESC"
            Dim cmd As New SqlCommand(sqlStatement, connection)
            Dim sqlDa As New SqlDataAdapter(cmd)

            sqlDa.Fill(dt)
            If dt.Rows.Count > 0 Then
                MyDataGrid.DataSource = dt
                MyDataGrid.DataBind()
            End If
        Catch ex As System.Data.SqlClient.SqlException
            Dim msg As String = "Fetch Error:"
            msg += ex.Message
            Throw New Exception(msg)
        Finally
            connection.Close()
        End Try
    End Sub
    'edit command
    Protected Sub MyDataGrid_RowEditing(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewEditEventArgs) Handles MyDataGrid.RowEditing
        'turn to edit mode
        MyDataGrid.EditIndex = e.NewEditIndex
        'Rebind the GridView to show the data in edit mode
        BindGrid()
    End Sub
    'cancel command
    Protected Sub MyDataGrid_RowCancelingEdit(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCancelEditEventArgs) Handles MyDataGrid.RowCancelingEdit
        ' switch back to edit default mode
        MyDataGrid.EditIndex = -1
        'Rebind the GridView to show the data in edit mode
        BindGrid()
    End Sub
    'Update Function
    Private Sub UpdateRecord(ByVal SOutageDetailId As String, ByVal SDescription As String, ByVal SDetailDescription As String, ByVal SCreateDate As String, ByVal SstatusId As String)
        Dim connection As New SqlConnection("server='\SQLEXPRESS'; trusted_connection='true'; Database='OutagesMgt_db'")
        Dim sqlStatement As String = String.Empty
        sqlStatement = "UPDATE OutageDetail SET @OutageDetailId = @OutageDetailId, LocationName = @LocationName, " & _
                        "Description = @Description, DetailDescription= @DetailDescription, " & _
                        "CreateDate = @CreateDate, StatusId = @StatusId WHERE OutageDetailId = @OutageDetailId"
        connection.Open()

        Dim cmd As New SqlCommand(sqlStatement, connection)
        cmd.Parameters.Add(New SqlParameter("@OutageDetailId", SOutageDetailId))
        cmd.Parameters.Add(New SqlParameter("@LocationName", SDescription))
        cmd.Parameters.Add(New SqlParameter("@Description", SDescription))
        cmd.Parameters.Add(New SqlParameter("@DetailDescription", SDetailDescription))
        cmd.Parameters.Add(New SqlParameter("@CreateDate", SCreateDate))
        cmd.Parameters.Add(New SqlParameter("@StatusId", SstatusId))
        cmd.CommandType = CommandType.Text
        cmd.ExecuteNonQuery()


        ' MyDataGrid.EditIndex = -1
        connection.Close()

        BindGrid()
    End Sub
    'update command
    Protected Sub MyDataGrid_RowUpdating(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewUpdateEventArgs) Handles MyDataGrid.RowUpdating
        'Accessing Edited values from the GridView
        Dim SOutageDetailId As String = MyDataGrid.Rows(e.RowIndex).Cells(0).Text
        Dim SDescription As String = MyDataGrid.Rows(e.RowIndex).Cells(1).Text
        Dim SDetailDescription As String = MyDataGrid.Rows(e.RowIndex).Cells(2).Text
        Dim SCreateDate As String = MyDataGrid.Rows(e.RowIndex).Cells(3).Text
        Dim SstatusId As String = MyDataGrid.Rows(e.RowIndex).Cells(4).Text

        'Call the function to update the GridView
        UpdateRecord(SOutageDetailId, SDescription, SDetailDescription, SCreateDate, SstatusId)

        MyDataGrid.EditIndex = -1

        'Rebind Gridview to reflect changes made
        BindGrid()
    End Sub
End Class

aspx代碼:

<asp:GridView id="MyDataGrid" runat="server"
                    Width="750px"
                    CssClass="gridViewEdit"
                    BackColor="White"
                    BorderColor="Black"
                    CellPadding="3"
                    Font-Name="Verdana"
                    Font-Size="8pt"
                    HeaderStyle-BackColor="#FFFFFF"
                    OnEditCommand="MyDataGrid_RowEditing"
                    OnCancelCommand="MyDataGrid_RowCancelingEdit"
                    OnUpdateCommand="MyDataGrid_RowUpdating"
                    DataKeyField="OutageDetailId" 
                    Font-Names="Verdana">
                  <Columns>
                     <asp:CommandField ShowEditButton="True" EditText="Edit" CancelText="Cancel" UpdateText="Update" />
                 </Columns>
                <HeaderStyle BackColor="White"></HeaderStyle>
            </asp:GridView>

有人可以告訴我我想念的東西嗎。

按下“編輯”后,您將獲得必須更新的行的ID,並從此行中獲取它

Dim SOutageDetailId As String = MyDataGrid.Rows(e.RowIndex).Cells(0).Text

但是在頁面加載上您已經設置

    If Not IsPostBack Then
        BindGrid()
    End If

因此在回發頁面上,直到您嘗試從單元格獲取ID的網格都是空的。

有兩種方法,以太再次在回發時提供數據,並在更新后立即創建DataBind ,或者獲取Grid View的索引以進行更新,而不采用單元格。

例如,我將您的代碼更改為:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)        
        BindGrid()
End Sub

Private Sub BindGrid()
    Dim dt As New DataTable()
    Dim connection As New SqlConnection("server='\SQLEXPRESS'; trusted_connection='true'; Database='OutagesMgt_db'")
    Try
        connection.Open()
        Dim sqlStatement As String = "SELECT OutageDetailId, LocationName, Description, DetailDescription, CreateDate, StatusId FROM OutageDetail WHERE StatusId='1' ORDER BY CreateDate DESC"
        Dim cmd As New SqlCommand(sqlStatement, connection)
        Dim sqlDa As New SqlDataAdapter(cmd)

        sqlDa.Fill(dt)
        If dt.Rows.Count > 0 Then
            MyDataGrid.DataSource = dt
           If Not IsPostBack Then
               MyDataGrid.DataBind()
           End If                
        End If
    Catch ex As System.Data.SqlClient.SqlException
        Dim msg As String = "Fetch Error:"
        msg += ex.Message
        Throw New Exception(msg)
    Finally
        connection.Close()
    End Try
End Sub

[*]假設您在sql上沒有其他錯誤...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM