无法从 Gridview 插入已编辑的数据

Posted

技术标签:

【中文标题】无法从 Gridview 插入已编辑的数据【英文标题】:Not able to insert edited data from Gridview 【发布时间】:2021-10-30 01:23:12 【问题描述】:

使用 GridView 我试图通过单击提交按钮将所有记录(包括已编辑的列)插入数据库。但是,它总是插入页面加载后从数据库中获取的初始数据。

我希望用户编辑“id”列,点击提交按钮后,所有记录都应该插入到表中。使用当前代码,插入正在发生,但是在 id 列中,我总是在 DB 中得到“MG_US-FCWI1.05.30”和“MG_US-FCWI1.05.10”。但我想插入“MG_US-FCWI1”和“MG_US-FCW”。我正在使用 VS2013。

使用的代码 -

            <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false">
            <Columns>
                <asp:BoundField DataField="column_name" HeaderText ="Material Name" />
                <asp:BoundField DataField="part number" HeaderText ="Material Number" />                    
                <asp:TemplateField HeaderText="Id">
                <ItemTemplate>
                    <asp:TextBox ID="txtedit" runat="server" Text='<%# Eval("id") %>' ReadOnly="false"></asp:TextBox>
                </ItemTemplate>
                </asp:TemplateField>
                <asp:BoundField DataField="GL_account" HeaderText ="GL Account" />
            </Columns>
        </asp:GridView>
        
    <asp:Button ID="btnUpload" Text="Submit" runat="server" OnClick="Submit_Data" Height="21px" style="margin-left: 260px; margin-top: 14px;" />
        
        
        
    protected void Submit_Data(object sender, EventArgs e)
    
        foreach (GridViewRow row in GridView1.Rows)
                                      
                    SqlConnection con = new SqlConnection(getConn());
                    SqlCommand com = new SqlCommand("insert into test ([Sales Order Id],[input data],Material_Name,[Part Number],id,GL_Account) values  (" + sales_order_id + "," + input_id + ",'" + row.Cells[0].Text + "','" + row.Cells[1].Text + "','" + ((TextBox)row.Cells[2].FindControl("txtedit")).Text + "','" + row.Cells[3].Text + "')", con);
                    con.Open();
                    com.ExecuteNonQuery();
                    con.Close();
                
    

【问题讨论】:

哼,为什么文本框设置为只读?我的意思是,没关系,但我会删除那个只读标签 没错。可以删除。 【参考方案1】:

这是一个很好的例子,说明了为什么你不想连接那个长字符串(减少 SQL 注入问题 - 但也允许更容易阅读和更容易编写代码)。

它难以阅读,从而清理它?

然后代码中的错误就变得清晰了。

你有这个:

((TextBox)row.Cells[2].FindControl("txtedit")).Text

但是,应该是这样的:

((TextBox)row.FindControl("txtedit")).Text

课程:让您的代码可读,您可以更快地发现错误并发布。

这样说:

        foreach (GridViewRow row in GridView1.Rows)
        
            SqlCommand com = new SqlCommand("insert into test " +
                "([Sales Order Id],[input data],Material_Name,[Part Number],id,GL_Account)" +
                "(@SalesID,@InputData,@MatName,@PartNum,@id,@GLAccount)",
                new SqlConnection(getConn()));

            com.Connection.Open();
            com.Parameters.Add("@SalesID", SqlDbType.Int).Value = sales_order_id;
            com.Parameters.Add("@InputData", SqlDbType.Int).Value = input_id;
            com.Parameters.Add("@MatName", SqlDbType.NVarChar).Value = row.Cells[0].Text;
            com.Parameters.Add("@PartNum", SqlDbType.Int).Value = row.Cells[1].Text;
            com.Parameters.Add("@GlAccount", SqlDbType.NVarChar).Value = ((TextBox)row.FindControl("txtedit")).Text;

            com.ExecuteNonQuery();
            com.Connection.Close();

        

我认为您不需要在 int 值周围使用 Convert.ToInt32()。

但是,只需将代码重写为可读性,就很容易发现 findcontrol 错误。另外,请注意我们如何不必猜测我们是否需要在字符串周围加上额外的引号,或者不需要为数字加上引号 - 所以我们在这里强转换,这也更好。

现在上面是空气代码,但是在我输入第一个参数之后,我开始按 ctr-d 复制该行 - 所以我必须做的输入量实际上非常少 - 在 intellisense 和 之间Ctrl-d,然后打字减少了,但代码不仅更易于阅读,而且我们可以例如随着时间的推移添加另一个行/参数集,再次修改此代码将减少您的碳基税计算机(你的大脑)而不是基于计算机的硅大脑。

【讨论】:

感谢您的回复。它只是简单的代码。但是它仍然没有解决我的问题。编辑后的文本仍未写入数据库。 你删除了只读标签? - 这会阻止编辑。因此,您希望插入新行 - 而不是编辑现有行?是的,你所拥有的应该可以工作。 不,我没有删除只读标签。我刚刚复制了你的 C# 代码。尽管如此,问题仍然相同。我可以在 GridView 中编辑文本框,但无法在 DB 中写入编辑后的文本。 嗯,是发生了错误,还是没有插入任何值?代码运行后表格的行数是否增加?添加使用“使用 System.Diagnostics;”并添加一些 debug.writeline 命令来查看值是什么?我的意思是,插入命令必须失败,或者至少在表中插入一行并带有一些空白值。在那个表单上放一个按钮,然后写一些硬代码来插入一个测试行,这样行吗? 我发现了问题。我错过了在导致问题的 Page_load 函数中添加 if (!IsPostBack)。

以上是关于无法从 Gridview 插入已编辑的数据的主要内容,如果未能解决你的问题,请参考以下文章

.net高手:我想在gridview加入一列图片

GridView 更新/删除崩溃

在GridView中插入行

无法将日期选择器添加到 C# .NET gridview 单元格

如何在gridPanel中的每一行添加一个按钮

DEV控件的Gridview1