0

私はこのチュートリアルに従っています。彼はテンプレートフィールドを使用し、データを表示するためにテキストボックスを入れています。

<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" />

txtbox がないため、SQL ステートメントを更新しているときに、boundfield 値を取得するにはどうすればよいですか?

私の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" >
4

2 に答える 2

2

TemplateFields の代わりに BoundFields を使用する場合は、GridView1_RowUpdatingイベント ハンドラーを介してユーザーが入力した値を見つけることができます。type の引数があります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」を使用します。

于 2013-04-30T13:11:28.137 に答える
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]コードビハインドで必要なセルの値を提供する必要があります。

于 2013-04-30T13:04:16.330 に答える