更新从下拉列表中指定的数据网格中的特定列

时间:2014-04-02 12:32:51

标签: asp.net sql vb.net gridview

我是ASP.NET和VB的新手:所以即时退出低级别。 我正在尝试使用<asp:BoundField DataField..><asp:TemplateField..>显示网格视图。 使用Boundfield时,我能够让viewgrid显示我想要的内容,但我无法编辑它。它告诉我:“输入字符串的格式不正确”。使用模板时,我甚至无法显示gridview。

如果可以使用gridview我开始工作并且能够编辑那个,那么我将坚持这种格式。

我的数据库看起来像这样:

[TBL_CASE](
    [caseId] [int] IDENTITY(1,1) NOT NULL,
    [caseSub] [int] NULL,
    [caseUser] [int] NULL,
    [caseType] [varchar](200) NULL,
    [caseRegBy] [varchar](100) NULL,
    [caseTopic] [varchar](300) NULL,
    [caseDesc] [varchar](max) NULL,
    [caseDtCreated] [datetime] NULL,
    [caseStatus] [bit] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

我的GridView是这样的,下面有一个数据源来获取我用来整理显示内容的下拉列表:

 <asp:GridView ID="caseList" HeaderStyle-BackColor="#3AC0F2" HeaderStyle-ForeColor="White"
                runat="server" AutoGenerateColumns="false" OnRowEditing="editCase_RowEditing"
                OnRowUpdating="UpdateCase_RowUpdating" OnRowCancelingEdit="updateCase_RowCancelingEdit">
                <Columns>
                    <asp:BoundField DataField="caseId" HeaderText="Saksnr" ItemStyle-Width="20" DataFormatString="Int" />
                    <asp:BoundField DataField="userName" HeaderText="Bruker" ItemStyle-Width="150" />
                    <asp:BoundField DataField="caseType" HeaderText="Type" ItemStyle-Width="150" />
                    <asp:BoundField DataField="caseRegby" HeaderText="Reg. av" ItemStyle-Width="60" />
                    <asp:BoundField DataField="caseTopic" HeaderText="Tittel" ItemStyle-Width="150" />
                    <asp:BoundField DataField="caseDesc" HeaderText="Beskrivelse" ItemStyle-Width="300" />
                    <asp:BoundField DataField="caseDtCreated" HeaderText="Opprettet dato" ItemStyle-Width="80" />
                    <asp:TemplateField HeaderText="Status" SortExpression="caseStatus" ItemStyle-Width="30">
                        <ItemTemplate>
                            <%#IIf(Boolean.Parse(Eval("caseStatus").ToString()),
 "Lukket", "Åpen")%></ItemTemplate>
                    </asp:TemplateField>
                    <asp:CommandField ShowEditButton="True" />
                </Columns>
            </asp:GridView>

我尝试使用的更新程序如下:

Protected Sub UpdateCase_RowUpdating(ByVal sender As Object, ByVal e As GridViewUpdateEventArgs)

    sqlConnection.Open()
    sqlCommand = New SqlClient.SqlCommand("update TBL_CASE set TBL_CASE.caseType = @caseType, TBL_CASE.caseRegBy = @caseRegby, TBL_CASE.caseTopic = @caseTopic, TBL_CASE.caseDesc = @caseDesc where caseId = @caseID ")
    sqlCommand.Connection = sqlConnection

    Dim Id As Integer = caseList.Rows(e.RowIndex).Cells(0).Text
    Dim Type As String = DirectCast(caseList.Rows(e.RowIndex).FindControl("caseType"), TextBox).Text
    Dim Regby As String = DirectCast(caseList.Rows(e.RowIndex).FindControl("caseRegby"), TextBox).Text
    Dim Topic As String = DirectCast(caseList.Rows(e.RowIndex).FindControl("caseTopic"), TextBox).Text
    Dim Desc As String = DirectCast(caseList.Rows(e.RowIndex).FindControl("caseDesc"), TextBox).Text

    sqlCommand.Parameters.Add("@caseID", SqlDbType.Int).Value = Id
    sqlCommand.Parameters.Add("@caseType", SqlDbType.VarChar, 200).Value = Type
    sqlCommand.Parameters.Add("@caseRegby", SqlDbType.VarChar, 100).Value = Regby
    sqlCommand.Parameters.Add("@caseTopic", SqlDbType.VarChar, 300).Value = Topic
    sqlCommand.Parameters.Add("@caseDesc", SqlDbType.VarChar, 800).Value = Desc

    sqlCommand.ExecuteNonQuery()
    caseList.EditIndex = -1
    sqlConnection.Close()
    BindData()

End Sub

我不明白我写错了什么。我看到如果我使用模板字段,我实际上已经能够更新数据库,但是在将数据显示到网格视图时会出现问题。

我的错误讯息:

Object reference not set to an instance of an object.caseType 
Description: An unhandled exception occurred during the execution of the current web  

请求。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

Exception Details: System.Exception: Object reference not set to an instance of an object.caseType

来源错误:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.  

堆栈追踪:

[Exception: Object reference not set to an instance of an object.caseType]
Supportomatic_2000.Showcase.UpdateCase_RowUpdating(Object sender, GridViewUpdateEventArgs e) +1031
System.Web.UI.WebControls.GridView.OnRowUpdating(GridViewUpdateEventArgs e) +139
System.Web.UI.WebControls.GridView.HandleUpdate(GridViewRow row, Int32 rowIndex, Boolean causesValidation) +808
System.Web.UI.WebControls.GridView.HandleEvent(EventArgs e, Boolean causesValidation, String validationGroup) +855
System.Web.UI.WebControls.GridView.OnBubbleEvent(Object source, EventArgs e) +95
System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +37
System.Web.UI.WebControls.GridViewRow.OnBubbleEvent(Object source, EventArgs e) +121
System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +37
System.Web.UI.WebControls.LinkButton.OnCommand(CommandEventArgs e) +125
System.Web.UI.WebControls.LinkButton.RaisePostBackEvent(String eventArgument) +169System.Web.UI.WebControls.LinkButton.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +9
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +176
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +5563

最后我看到,因为我正在使用标签:

<asp:BoundField DataField="caseType" HeaderText="Type" ItemStyle-Width="150" />

我无法使用获取方法:

Dim Type As String = DirectCast(caseList.Rows(e.RowIndex).FindControl("caseType"), TextBox).Text

但需要另辟蹊径,这是对的吗?如果是,那怎么办?

1 个答案:

答案 0 :(得分:0)

我发现了我的问题,看起来,当我更改了我想要从boundfield更新到模板字段的字段的标记时,它的工作正常,如下面的标记:

    <asp:TemplateField HeaderText="Henv. gjelder">
                <EditItemTemplate>
                    <asp:TextBox ID="caseType" runat="server" Text='<%#Eval("caseType")%>'/>
                </EditItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="lblcaseType" runat="server" Text='<%#Eval("caseType")%>'/>
                </ItemTemplate>
                <FooterTemplate>
                    <asp:TextBox ID="txtftrcaseType" runat="server"/>
                <asp:RequiredFieldValidator ID="rfvcaseType" runat="server" ControlToValidate="txtftrcaseType" Text="*" ValidationGroup="validation"/>
                </FooterTemplate>
    </asp:Templatefield>