2

私はを持っていてGridView、それはデータベースにバインドされています。GridView データベース内のおよび対応するテーブルを更新するのに問題があります。

GridViewSQLdatasourceにバインドした後の私の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();

    }
4

3 に答える 3

4

GridView2.DataBind()1)治療の最後に電話する必要があります

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)あなたに定義UpdateCommandするSqlDataSource

<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

于 2012-08-31T18:55:52.357 に答える
1

を呼び出すだけで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!
}
于 2012-08-31T18:55:41.953 に答える
0

データバインドされたグリッドビューとバインドされた列を操作するために、コードビハインドは必要ありませんでした。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)と一致していることを確認してください。グリッドビューコントロールで、[編集を有効にする]を選択します。

于 2012-08-31T19:48:16.603 に答える