使用 boundfield 时如何更新 GridView
Posted
技术标签:
【中文标题】使用 boundfield 时如何更新 GridView【英文标题】:How to Update a GridView when boundfield is used 【发布时间】:2012-08-26 14:36:28 【问题描述】:我有一个GridView
,它已绑定到数据库。我在更新数据库中的GridView
和相应的表时遇到了困难。
绑定到 SQLdatasource 后我的GridView
的 asp 代码是:
<asp:GridView ID="GridView2" runat="server" OnRowEditing="GridView2_RowEditing"
OnRowUpdating="GridView2_RowUpdating" CellPadding="4" ForeColor="#333333" OnRowCancelingEdit="GridView2_RowCancelingEdit"
OnRowDataBound="GridView2_RowDataBound" AutoGenerateColumns="False"
DataSourceID="SqlDataSource1" AutoGenerateEditButton="True" DataKeyNames="Locations">
<Columns>
<asp:BoundField DataField="Locations" HeaderText="Locations"
SortExpression="Locations" ReadOnly="true"/>
<asp:BoundField DataField="Lamp_pro4" HeaderText="Lamp_pro4"
SortExpression="Lamp_pro4" />
<asp:BoundField DataField="Lamp_pro5" HeaderText="Lamp_pro5"
SortExpression="Lamp_pro5" />
<asp:BoundField DataField="AC_Profile5" HeaderText="AC_Profile5"
SortExpression="AC_Profile5" />
</Columns>
</asp:GridView>
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:TouchPadConnectionString %>"
SelectCommand="SELECT * FROM [Quantity]">
</asp:SqlDataSource>
我的数据键是 Locations 并且它是只读的。
更新的.cs代码是:
protected void GridView2_RowUpdating(object sender, GridViewUpdateEventArgs e)
SqlConnection con = new SqlConnection("Data Source=ARCHANA-PC\\ARCHANA;Initial Catalog=TouchPad;Integrated Security=True");
string LocName = GridView2.DataKeys[e.RowIndex].Values["Locations"].ToString();
TextBox txt1 = (TextBox)GridView2.Rows[e.RowIndex].FindControl("Lamp_pro4");
TextBox txt2 = (TextBox)GridView2.Rows[e.RowIndex].FindControl("Lamp_pro5");
TextBox txt3 = (TextBox)GridView2.Rows[e.RowIndex].FindControl("AC_Profile5");
string updStmt = "UPDATE Quantity set Lamp_pro4=@Lamp_pro4,Lamp_pro5=@Lamp_pro5,AC_Profile5=@AC_Profile5 where Locations=@locName";
con.Open();
SqlCommand updCmd = new SqlCommand(updStmt, con);
updCmd.Parameters.AddWithValue("@locName", LocName);
updCmd.Parameters.AddWithValue("@Lamp_pro4", txt1.Text);
updCmd.Parameters.AddWithValue("@Lamp_pro5", txt2.Text);
updCmd.Parameters.AddWithValue("@AC_Profile5", txt3.Text);
updCmd.ExecuteNonQuery();
GridView2.DataBind();
【问题讨论】:
【参考方案1】:1) 您必须在治疗结束时致电GridView2.DataBind()
protected void GridView2_RowUpdating(object sender, GridViewUpdateEventArgs e)
//GridViewRow row = (GridViewRow)GridView2.Rows[e.RowIndex];
string LocName = GridView2.DataKeys[e.RowIndex].Values["Locations"].ToString();
TextBox txt1 = (TextBox)GridView2.Rows[e.RowIndex].FindControl("Lamp_pro4");
TextBox txt2 = (TextBox)GridView2.Rows[e.RowIndex].FindControl("Lamp_pro5");
TextBox txt3 = (TextBox)GridView2.Rows[e.RowIndex].FindControl("AC_Profile5");
con.Open();
SqlCommand cmd = new SqlCommand("UPDATE Quantity set Lamp_pro4='" + txt1.Text + "',Lamp_pro5='" + txt2.Text + "',AC_Profile5='" + txt3.Text + "' where Locations=" + LocName, con);
cmd.ExecuteNonQuery();
con.Close();
GridView2.EditIndex = -1;
//BindQuantity();
GridView2.DataBind();
2) 在SqlDataSource
上定义UpdateCommand
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:TouchPadConnectionString %>"
SelectCommand="SELECT * FROM [Quantity]"
UpdateCommand="UPDATE Quantity set Lamp_pro4 = @Lamp_pro4 ,Lamp_pro5=@Lamp_pro5,AC_Profile5=@AC_Profile5 where Locations=@Locations">
</asp:SqlDataSource>
链接:http://msdn.microsoft.com/fr-fr/library/system.web.ui.webcontrols.sqldatasource.updatecommand.aspx
【讨论】:
不,它不起作用。更新命令出错:对象引用未设置为对象的实例。 要抛出这个异常的行吗? 是的,你必须定义 UpdateCommand Archana 我给你的链接非常有趣 我还在 sqldatasorce 上尝试了 UpdateCommand,但没有工作。我想知道我是否应该在 asp 代码中添加 templatefield、Itemtemplate 和 edittemplate ......但我不知道如何添加。请通过编辑我的代码提供帮助。 我很乐意帮助你 Archana【参考方案2】:只需调用GridView2.DataBind()
将您的数据重新绑定到控件上。
无论如何,您应该真正使用SQL 参数 来防止SQL 注入!看看这个例子
string connetionString = "YOUR_CONSTR" ;
string updStmt = "UPDATE Quantity set Lamp_pro4=@lamp_pro4,Lamp_pro5=@Lamp_pro5,AC_Profile5=@ac_profile5 " +
"where Locations=@locName";
using (SqlConnection cnn = new SqlConnection(connetionString))
cnn.Open();
SqlCommand updCmd = new SqlCommand(updStmt , cnn);
// use sqlParameters to prevent sql injection!
updCmd.Parameters.AddWithValue("@lamp_pro4", txt1.Text);
// or define dataType if necessary
SqlParameter p1 = new SqlParameter();
p1.ParameterName = "@Lamp_pro5";
p1.SqlDbType = SqlDbType.Int;
p1.Value = txt2.Text;
updCmd.Parameters.Add(p1);
// demo code must be adapted!! (correct paramNames, textbox names, add missing params ...)
int affectedRows = updCmd.ExecuteNonQuery();
Debug.WriteLine(affectedRows + " rows updated!");
如果您在访问文本框时遇到问题,您可以修改此示例
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
string Lamp_pro4 = e.NewValues["Lamp_pro4"].ToString();
Debug.WriteLine("Lamp_pro4: " + Lamp_pro4); // to check if everything works fine!
【讨论】:
不,它不起作用。是的,一旦开始,我将使用 SQL 参数来实现它。 不,它不起作用。更新命令出错:对象引用未设置为对象的实例。我已根据您发送的内容编辑了我的问题。 我没有看到任何 SqlConnection 实例被创建!?像 SqlConnection con = new SqlConnection(CON_STR) 或者在我的示例中使用类似的东西。此外,没有 executeNonQuery() 和 gridView2.DataBind() 我已经在问题中编辑了我的代码,并更改了您要求我做的事情。是的不工作。当我调试程序时: txt1,txt2,txt3 为空。我认为它没有保存我在网格中输入的值。一些小错误。无法弄清楚它是什么。请帮忙。 我编写了一个小示例代码来展示如何在 gridView 中轻松访问新值!【参考方案3】:使用数据绑定网格视图和绑定列不需要任何代码。 ASPX 标记为您完成所有更新。
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="recid" DataSourceID="SqlDataSource1">
<Columns>
<asp:CommandField ShowEditButton="True" />
<asp:BoundField DataField="recid" HeaderText="recid" InsertVisible="False" ReadOnly="True" SortExpression="recid" />
<asp:BoundField DataField="BranchName" HeaderText="BranchName" SortExpression="BranchName" />
<asp:BoundField DataField="ParentId" HeaderText="ParentId" SortExpression="ParentId" />
</Columns>
</asp:GridView>
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:ZA_testConnectionString %>"
SelectCommand="SELECT * FROM [Branch]"
UpdateCommand="UPDATE [BRANCH] SET BranchName=@BranchName , ParentId=@ParentId WHERE recid=@recid">
</asp:SqlDataSource>
我已经测试了这段代码,它会读取表格,并允许编辑记录。值得关注的点。确保您有更新查询。确保更新中的参数与字段名称(@branchName、@ParentId)匹配。在 gridview 控件上选择启用编辑。
【讨论】:
在浏览器中给我一个错误:必须声明标量变量“@Locations”。如果我删除 InsertVisible="False" ReadOnly="True",它可以正常工作,但所有其他行都将使用相同的值进行编辑。请帮助我,而我正急于摆脱这个问题。谢谢 您的列标题或 SQL 字段名称将自动声明为变量。如果您的选择数据 [Locations] 中有一列,您可以在插入语句中使用 set [Locations]=@locations。希望这会有所帮助。以上是关于使用 boundfield 时如何更新 GridView的主要内容,如果未能解决你的问题,请参考以下文章
渲染时捕获 TypeError:“BoundField”对象不可迭代
如何在gridbox中使用comparevalidator和gridview中的boundfield项
如何在 asp GridView BoundField 中正确显示换行符而不关闭 HTML 编码