如何获得边界值,还是我完全错了?

时间:2013-04-30 12:29:36

标签: c# asp.net gridview

我正在使用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" >

2 个答案:

答案 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]值。