【问题标题】:Inserting an empty row into sql table when i insert from gridview当我从gridview插入时,在sql表中插入一个空行
【发布时间】:2015-02-25 17:56:06
【问题描述】:

插入

  • 将所有字段转换为模板字段
  • 为网格启用页脚
  • 在页脚模板中添加了文本框

这里是 aspx.cs 的代码

    protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        SqlDataSource1.Insert();           
    }

这是插入命令的 .aspx 代码

 InsertCommand="INSERT INTO [Net Weight Tracking] (Date, [Unit UPC Base Item], [Item (Optional)], [Preset Number], [Product Group], Shift, [Rotation Code], BBD, [Operator Name], Supervisor, [Production Line], [Bagger Number], [Start Time], [Stop Time], [Under Counts], [Label Wt on Pkg (g)], [Machine Tare Wt (g)], [Actual Tare Wt (g)], [Verify Target Wt (g)], [Total Count (Proper)], [Mean Gross (g)], [Rptd Mean Net (g)], [Std Dev (g)], [Max (g)], [Min (g)], [TNE (g)], Comments, Field1, Field2, Field3) VALUES (@date, @unit, @item, @preset, @prodgroup, @shift, @rotationcode, @bbd, @operatorname, @supervisorname, @productionline, @baggernumber, @starttime, @stoptime, @undercount, @labelwt, @machine, @actual, @verify, @totalcount, @meangross, @rptd, @std, @mx, @min, @tne, @comments, @field, @field2, @field3)" 
<InsertParameters>
            <asp:Parameter Name="Date" />
            <asp:Parameter Name="UnitUPCBaseItem" />
            <asp:Parameter Name="Item" />
            <asp:Parameter Name="Preset" />
            <asp:Parameter Name="Product" />
            <asp:Parameter Name="Shift" />
            <asp:Parameter Name="Rotation" />
            <asp:Parameter Name="BBD" />
            <asp:Parameter Name="Operator" />
            <asp:Parameter Name="Supervisor" />
            <asp:Parameter Name="Production" />
            <asp:Parameter Name="Bagger" />
            <asp:Parameter Name="Start" />
            <asp:Parameter Name="Stop" />
            <asp:Parameter Name="Under" />
            <asp:Parameter Name="Label" />
            <asp:Parameter Name="Machine" />
            <asp:Parameter Name="Actual" />
            <asp:Parameter Name="Verify" />
            <asp:Parameter Name="Total" />
            <asp:Parameter Name="Mean" />
            <asp:Parameter Name="Rptd" />
            <asp:Parameter Name="Std" />
            <asp:Parameter Name="Max" />
            <asp:Parameter Name="Min" />
            <asp:Parameter Name="TNE" />
            <asp:Parameter Name="Comments" />
            <asp:Parameter Name="Field1" />
            <asp:Parameter Name="Field2" />
            <asp:Parameter Name="Field3" />
            <asp:Parameter Name="date" />
            <asp:Parameter Name="unit" />
            <asp:Parameter Name="item" />
            <asp:Parameter Name="preset" />
            <asp:Parameter Name="prodgroup" />
            <asp:Parameter Name="shift" />
            <asp:Parameter Name="rotationcode" />
            <asp:Parameter Name="bbd" />
            <asp:Parameter Name="operatorname" />
            <asp:Parameter Name="supervisorname" />
            <asp:Parameter Name="productionline" />
            <asp:Parameter Name="baggernumber" />
            <asp:Parameter Name="starttime" />
            <asp:Parameter Name="stoptime" />
            <asp:Parameter Name="undercount" />
            <asp:Parameter Name="labelwt" />
            <asp:Parameter Name="machine" />
            <asp:Parameter Name="actual" />
            <asp:Parameter Name="verify" />
            <asp:Parameter Name="totalcount" />
            <asp:Parameter Name="meangross" />
            <asp:Parameter Name="rptd" />
            <asp:Parameter Name="std" />
            <asp:Parameter Name="mx" />
            <asp:Parameter Name="min" />
            <asp:Parameter Name="tne" />
            <asp:Parameter Name="comments" />
            <asp:Parameter Name="field" />
            <asp:Parameter Name="field2" />
            <asp:Parameter Name="field3" />
        </InsertParameters>

我输入所有数据并单击插入,它会在我的 sql 表中插入一个包含所有空值的空行,我希望将数据插入数据库并反映在网格中

我认为 gridview 没有获取值,所以我在插入时尝试了这个仍然无法正常工作:

 <InsertParameters>
                 <asp:FormParameter FormField="TextBox31" Name="Date" Type="DateTime" />
            <asp:FormParameter FormField="TextBox32" Name="Unit_UPC_Base_Item" 
                Type="String" />
            <asp:FormParameter FormField="TextBox33" Name="column1" Type="String" />

            <asp:FormParameter FormField="TextBox35" Name="Product_Group" Type="String" />
            <asp:FormParameter FormField="TextBox36" Name="Shift" Type="String" />
            <asp:FormParameter FormField="TextBox37" Name="Rotation_Code" Type="String" />
            <asp:FormParameter FormField="TextBox38" Name="BBD" Type="String" />
            <asp:FormParameter FormField="TextBox39" Name="Operator_Name" Type="String" />
            <asp:FormParameter FormField="TextBox40" Name="Supervisor" Type="String" />
            <asp:FormParameter FormField="TextBox41" Name="Production_Line" Type="String" />
            <asp:FormParameter FormField="TextBox42" Name="Bagger_Number" Type="Double" />
            <asp:FormParameter FormField="TextBox43" Name="Start_Time" Type="DateTime" />
            <asp:FormParameter FormField="TextBox44" Name="Stop_Time" Type="DateTime" />
            <asp:FormParameter FormField="TextBox45" Name="Under_Counts" Type="Double" />
            <asp:FormParameter FormField="TextBox46" Name="column2" Type="Double" />
            <asp:FormParameter FormField="TextBox47" Name="column3" Type="Double" />
            <asp:FormParameter FormField="TextBox48" Name="column4" Type="Double" />
            <asp:FormParameter FormField="TextBox49" Name="column5" Type="Double" />
            <asp:FormParameter FormField="TextBox50" Name="column6" Type="Double" />
            <asp:FormParameter FormField="TextBox51" Name="column7" Type="Double" />
            <asp:FormParameter FormField="TextBox52" Name="column8" Type="Double" />
            <asp:FormParameter FormField="TextBox53" Name="column9" Type="Double" />
            <asp:FormParameter FormField="TextBox54" Name="column10" Type="Double" />
            <asp:FormParameter FormField="TextBox55" Name="column11" Type="Double" />
            <asp:FormParameter FormField="TextBox56" Name="column12" Type="Double" />
            <asp:FormParameter FormField="TextBox57" Name="Comments" Type="String" />
            <asp:FormParameter FormField="TextBox58" Name="Field1" Type="DateTime" />
            <asp:FormParameter FormField="TextBox59" Name="Field2" Type="DateTime" />
            <asp:FormParameter FormField="TextBox60" Name="Field3" Type="String" />
            <asp:FormParameter FormField="TextBox34" Name="Preset_Number" />
</InsertParameters>

我有 rowcommand 事件,我认为单击 gridview 上的按钮会触发此事件,它确实触发了该事件,但它无法获取值。

请帮助

解决方案已实施但不起作用:

if (e.CommandName == "InsertRow")
            {
                SqlDataSource1.InsertParameters["Date"].DefaultValue = ((TextBox)GridView1.FooterRow.FindControl("TextBox31")).Text;
                SqlDataSource1.InsertParameters["Unit_UPC_Base_Item"].DefaultValue = ((TextBox)GridView1.FooterRow.FindControl("TextBox32")).Text;
                SqlDataSource1.InsertParameters["column1"].DefaultValue = ((TextBox)GridView1.FooterRow.FindControl("TextBox33")).Text;
                SqlDataSource1.InsertParameters["Preset_Number"].DefaultValue = ((TextBox)GridView1.FooterRow.FindControl("TextBox34")).Text;
                SqlDataSource1.InsertParameters["Product_Group"].DefaultValue = ((TextBox)GridView1.FooterRow.FindControl("TextBox35")).Text;
                SqlDataSource1.InsertParameters["Shift"].DefaultValue = ((TextBox)GridView1.FooterRow.FindControl("TextBox36")).Text;
                SqlDataSource1.InsertParameters["Rotation_Code"].DefaultValue = ((TextBox)GridView1.FooterRow.FindControl("TextBox37")).Text;
                SqlDataSource1.InsertParameters["BBD"].DefaultValue = ((TextBox)GridView1.FooterRow.FindControl("TextBox38")).Text;
                SqlDataSource1.InsertParameters["Operator_Name"].DefaultValue = ((TextBox)GridView1.FooterRow.FindControl("TextBox39")).Text;
                SqlDataSource1.InsertParameters["Supervisor"].DefaultValue = ((TextBox)GridView1.FooterRow.FindControl("TextBox40")).Text;
                SqlDataSource1.InsertParameters["Production_Line"].DefaultValue = ((TextBox)GridView1.FooterRow.FindControl("TextBox41")).Text;
                SqlDataSource1.InsertParameters["Bagger_Number"].DefaultValue = ((TextBox)GridView1.FooterRow.FindControl("TextBox42")).Text;
                SqlDataSource1.InsertParameters["Start_Time"].DefaultValue = ((TextBox)GridView1.FooterRow.FindControl("TextBox43")).Text;
                SqlDataSource1.InsertParameters["Stop_Time"].DefaultValue = ((TextBox)GridView1.FooterRow.FindControl("TextBox44")).Text;
                SqlDataSource1.InsertParameters["Under_Counts"].DefaultValue = ((TextBox)GridView1.FooterRow.FindControl("TextBox45")).Text;
                SqlDataSource1.InsertParameters["column2"].DefaultValue = ((TextBox)GridView1.FooterRow.FindControl("TextBox46")).Text;
                SqlDataSource1.InsertParameters["column3"].DefaultValue = ((TextBox)GridView1.FooterRow.FindControl("TextBox47")).Text;
                SqlDataSource1.InsertParameters["column4"].DefaultValue = ((TextBox)GridView1.FooterRow.FindControl("TextBox48")).Text;
                SqlDataSource1.InsertParameters["column5"].DefaultValue = ((TextBox)GridView1.FooterRow.FindControl("TextBox49")).Text;
                SqlDataSource1.InsertParameters["column6"].DefaultValue = ((TextBox)GridView1.FooterRow.FindControl("TextBox50")).Text;
                SqlDataSource1.InsertParameters["column7"].DefaultValue = ((TextBox)GridView1.FooterRow.FindControl("TextBox51")).Text;
                SqlDataSource1.InsertParameters["column8"].DefaultValue = ((TextBox)GridView1.FooterRow.FindControl("TextBox52")).Text;
                SqlDataSource1.InsertParameters["column9"].DefaultValue = ((TextBox)GridView1.FooterRow.FindControl("TextBox53")).Text;
                SqlDataSource1.InsertParameters["column10"].DefaultValue = ((TextBox)GridView1.FooterRow.FindControl("TextBox54")).Text;
                SqlDataSource1.InsertParameters["column11"].DefaultValue = ((TextBox)GridView1.FooterRow.FindControl("TextBox55")).Text;
                SqlDataSource1.InsertParameters["column12"].DefaultValue = ((TextBox)GridView1.FooterRow.FindControl("TextBox56")).Text;
                SqlDataSource1.InsertParameters["Comments"].DefaultValue = ((TextBox)GridView1.FooterRow.FindControl("TextBox57")).Text;
                SqlDataSource1.InsertParameters["Field1"].DefaultValue = ((TextBox)GridView1.FooterRow.FindControl("TextBox58")).Text;
                SqlDataSource1.InsertParameters["Field2"].DefaultValue = ((TextBox)GridView1.FooterRow.FindControl("TextBox59")).Text;
                SqlDataSource1.InsertParameters["Field3"].DefaultValue = ((TextBox)GridView1.FooterRow.FindControl("TextBox60")).Text;

                SqlDataSource1.Insert();

            }

正如你所说,我使用的是简单参数

  <InsertParameters>
                <asp:Parameter Name="Date" Type="DateTime" />
                <asp:Parameter Name="Unit_UPC_Base_Item" Type="String" />
                <asp:Parameter Name="column1" Type="String" />
                <asp:Parameter Name="Product_Group" Type="String" />
                <asp:Parameter Name="Shift" Type="String" />
                <asp:Parameter Name="Rotation_Code" Type="String" />
                <asp:Parameter Name="BBD" Type="String" />
                <asp:Parameter Name="Operator_Name" Type="String" />
                <asp:Parameter Name="Supervisor" Type="String" />
                <asp:Parameter Name="Production_Line" Type="String" />
                <asp:Parameter Name="Bagger_Number" Type="Double" />
                <asp:Parameter Name="Start_Time" Type="DateTime" />
                <asp:Parameter Name="Stop_Time" Type="DateTime" />
                <asp:Parameter Name="Under_Counts" Type="Double" />
                <asp:Parameter Name="column2" Type="Double" />
                <asp:Parameter Name="column3" Type="Double" />
                <asp:Parameter Name="column4" Type="Double" />
                <asp:Parameter Name="column5" Type="Double" />
                <asp:Parameter Name="column6" Type="Double" />
                <asp:Parameter Name="column7" Type="Double" />
                <asp:Parameter Name="column8" Type="Double" />
                <asp:Parameter Name="column9" Type="Double" />
                <asp:Parameter Name="column10" Type="Double" />
                <asp:Parameter Name="column11" Type="Double" />
                <asp:Parameter Name="column12" Type="Double" />
                <asp:Parameter Name="Comments" Type="String" />
                <asp:Parameter Name="Field1" Type="DateTime" />
                <asp:Parameter Name="Field2" Type="DateTime" />
                <asp:Parameter Name="Field3" Type="String" />
                <asp:Parameter Name="Preset_Number" />
            </InsertParameters>

【问题讨论】:

    标签: c# asp.net gridview


    【解决方案1】:

    那些不是FormParameters,它们是无法通过这样的表单访问的 GridView 字段。如果有的话,它们是来自 Gridview 控件的ControlParameters。但是你不是在做标准的插入,所以实现上述最简单的方法就是这样做”

    1. 在如上所示的插入参数框中,将所有表单参数更改为普通的旧Parameters
    2. 确保您的添加按钮有一个CommandName,例如“MyInsert”而不是“Insert”,“Insert”这个词是为标准的 gridview 操作保留的,并且从页脚中提取数据虽然很常见,但并不标准。
    3. RowCommand 事件中,确保在调用SqlDataSource1.Insert() 函数之前检查e 参数是否为e.CommandName="MyInsert"
    4. 此外,在调用 Insert() 之前,您必须将所有字段分配给 SqlDataSource1.InsertParameters 集合,如下所示:

    VB代码,不过转换起来应该很简单

    Private Sub GridView1_RowCommand(sender As Object, e As GridViewCommandEventArgs) Handles GridView1.RowCommand
      If e.CommandName = "MyInsert" Then
        SqlDataSource1.InsertParameters("Date").DefaultValue = foo("TextBox31")
        SqlDataSource1.InsertParameters("Unit_UPC_Base_Item").DefaultValue = foo("TextBox32")
        SqlDataSource1.InsertParameters("column1").DefaultValue = foo("TextBox33")
        .
        . (yada yada yada)
        .
        SqlDataSource1.Insert()
      End If
    End Sub
    
    ' Helper function
    Private Function foo( ControlID As String) As String
      ' add error checking
      Return CType(GridView1.FooterRow.FindControl(ControlID), TextBox).Text
    End Function
    

    1. 在大多数情况下,类型转换是隐式的,但您可能有一些文本值需要显式转换。

    我想就是这样 - 如果我遗漏了什么,请告诉我,我会更新帖子


    更新 2015/03/02 ~16:31EST

    何时检查RowCommand 事件

    当您使用 Gridview 上下文菜单并“启用选择”时,VisualStudio 将在字段列表的顶部插入一个 CommandField。当您使用对话框编辑列时,您可以看到命令字段中可用的所有选项。其中有:“插入”、“选择”、“删除”、“取消”等……这些都与标准的 GridView 操作相吻合。如果您为 Delete 命令提供具有 sql 或存储过程的 SqlDataSource,则删除选项将可用,如果您为 Insert 提供 sql 或存储过程,则同样可以使用 Insert

    每个操作的自动生成命令名是“Select$N”、“Delete$N”等,其中 N 是 GridView 命令按钮中的行号。这些事件中的每一个都有自己的事件处理程序,其名称为“RowSelecting”、“RowSelected”、“RowDeleting”、“RowDeleted”等。

    除了引发这些事件之外,gridview 还将这些标准事件“冒泡”到 RowCommand 事件处理程序。

    现在您必须了解有关 gridview 的一件事,这是直接来自 Microsoft:

    不直接支持将记录插入数据源 GridView 控件。但是,可以通过 结合使用 GridView 控件和 DetailsView 或 窗体视图控件。有关详细信息,请参阅 DetailsView 或 FormView, 分别。

    这应该告诉你一些事情。这是反直觉的,因为如果您查看 Gidview 中的 CommandField,您可以清楚地看到插入命令。使用带有一系列文本框的页脚行通常是为 GridView 控件优化行插入的方式。

    请记住,所有命令都通过 RowCommand 传递,即使它们有自己的处理程序(选择、取消、删除等),我们通常不会在那里查找它们。

    那么,您什么时候检查 RowCommand.CommandName?每当您尝试处理 Gridview 不支持的事件时,您都会进行检查。

    如果您想在不使用GridView Insert 命令的情况下进行插入,请首先从 CommandField 中禁用 Insert。它将可用,因为连接的SqlDataSource 定义了插入命令。

    您将 CommandField 转换为 TemplateField 并编辑模板并将按钮添加到 FooterTemplate:

    <FooterTemplate>
        <asp:Button ID="btnInsert" runat="server" CommandName="InsertRow" Text="Button" />
    </FooterTemplate>
    

    现在您需要在此处进行验证。

    如果上面定义的按钮触发了 CommandName 为“Insert”的 CommandEvent,那么您要么启用了 Insert(您不应该),要么您的自定义 CommandName 以单词“Insert”开头。插入事件的错误触发。

    如果您还记得 GridView 呈现的任何标准命令,例如“Select$3”。这会触发 Selecting/Selected 事件并冒泡到 RowCommand,CommandName="Select"。

    我认为您创建的按钮导致插入事件被触发。我可能是错的,但值得检查。在任何情况下,我都会尝试将 CommandName 更改为以保留字以外的内容开头。

    【讨论】:

    • 我尝试了该解决方案,但它仍然无法正常工作,任何其他替代方案,我都按照您的建议做了,在它插入空行之前,现在它甚至没有这样做。
    • 我看到你更新了原来的帖子。您在哪个事件中运行以 if e.CommandName == "InsertRow" 开头的代码?如果您仍在 SqlDatasource 中设置 FormParameters,它们必须是基本的简单 &lt;asp:Parameter ...&gt;'s
    • 我正在从受保护的 void GridView1_RowCommand(object sender, GridViewCommandEventArgs e) { } 运行它,该行命令应该在用户单击按钮时触发,我不确定这个网格有什么问题视图,当我创建详细信息视图并尝试插入新记录时,它能够插入:(并且它们是在行命令下引用的简单参数。
    • 如果您单步执行代码并进入行命令事件 - 您看到文本框的值了吗?是否将它们分配给参数默认值?
    • 调试是个好主意,它会去 if(e.commandname == InsertRow) 并抛出自己,由于某种奇怪的原因它无法检查,我删除了它并设置值和插入效果很好,是否建议检查 e.commandname??
    猜你喜欢
    • 1970-01-01
    • 2014-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多