我正在使用this tutorial,他正在使用templatefield然后将文本框放入其中以显示数据,就像这样,
<ItemTemplate>
<asp:Label ID="lblitemUsr" runat="server" Text='<%#Eval("UserName") %>'/>
</ItemTemplate>
<FooterTemplate>
<asp:TextBox ID="txtftrusrname" runat="server"/>
<asp:RequiredFieldValidator ID="rfvusername" runat="server" ControlToValidate="txtftrusrname" Text="*" ValidationGroup="validaiton"/>
</FooterTemplate>
</asp:TemplateField>
然后在更新gridview时他正在这样做,
SqlCommand cmd = new SqlCommand("update Employee_Details set City='" + txtcity.Text + "',Designation='" + txtDesignation.Text + "' where UserId=" + userid, con);
而我正在做的是,
<asp:BoundField DataField="userName" HeaderText="User" ItemStyle-Width="120px" />
现在如何在更新SQL语句时获取boundfield值,因为没有txtbox?
我的GridView声明,
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false"
CellPadding="5" OnRowDataBound="GridView1_RowDataBound" Width="800px" AllowPaging="True"
PageSize="5" GridLines="Horizontal" OnPageIndexChanging="GridView1_PageIndexChanging"
OnRowCancelingEdit="GridView1_RowCancelingEdit" OnRowDeleting="GridView1_RowDeleting"
OnRowUpdating="GridView1_RowUpdating" OnRowEditing="GridView1_RowEditing" >
答案 0 :(得分:2)
如果您想使用BoundFields而不是TemplateFields,您可以通过GridView1_RowUpdating
事件处理程序找到用户输入的值。它的参数类型为GridViewUpdateEventArgs
。您所要做的就是遍历“NewValues”集合以获取需要更新的列的值。
此外,您永远不应该将用户输入直接连接到SQL字符串。这是一个众所周知的被称为“SQL注入”的恶意攻击漏洞。用户参数(我已在下面的示例中包含它们)。
以下是一个例子:
protected void GridView1_RowUpdating(Object sender, GridViewUpdateEventArgs e)
{
string city = "";
string designation = "";
foreach (DictionaryEntry entry in e.NewValues)
{
if(entry.Key == "City")
{
city = entry.Value.ToString();
}
if(entry.Key == "Designation")
{
designation = entry.Value.ToString();
}
}
SqlCommand cmd = new SqlCommand("update Employee_Details set City=@City, Designation=@Designation where UserId=@UserId", con);
cmd.Parameters.Add("@City", SqlDbType.NVarChar);
cmd.Parameters.Add("@Designation", SqlDbType.NVarChar);
cmd.Parameters.Add("@UserId", SqlDbType.NVarChar);
cmd.Paramters["@City"].Value = city;
cmd.Paramters["@Designation"].Value = designation;
cmd.Paramters["@UserId"].Value = userid;
}
如果你要使用带有GridView的SqlDataSource,那么这些代码都不是必需的。数据源控件将处理所有更新逻辑。您只需要包含带参数的更新命令:
<asp:SqlDataSource ID="myDataSource" runat="server"
SelectCommand="Your select statement goes here"
UpdateCommand="update Employee_Details set City=@City, Designation=@Designation where UserId=@UserId" />
请注意,您需要以与BoundFields的“DataField”属性相同的方式命名参数。所以上面有<asp:BoundField DataField="userName"...
,那么你想在UpdateCommand中使用“@userName”作为该字段。
答案 1 :(得分:1)
您忘记在DataKeyNames
声明中设置最重要的内容<asp:Gridview></asp:GridView>
,先添加该内容,然后
您可以尝试这样:
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
int userid = Convert.ToInt32(GridView1.DataKeys[e.RowIndex]["userid"]);
string City= ((TextBox)(GridView1.Rows[e.RowIndex].Cells[2].Controls[0])).Text.Trim();
string Designation = ((TextBox)(GridView1.Rows[e.RowIndex].Cells[3].Controls[0])).Text.Trim();
SqlCommand cmd = new SqlCommand("update Employee_Details set City='" + City + "',Designation='" + Designation + "' where UserId=" + userid, con);
//
// other Code snippets
//
GridView1.EditIndex = -1;
BindGridview();
}
您必须在后面的代码中提供您想要的单元格的cell[n]
值。