问题
I currently am using two GridViews tied to different sqldatasources which both accept a value for each row using a textbox. When I go to edit and then update the other fields inside the row, the value which was filled by the textbox turns into an empty value. It was working properly before but after parametrising values as well as adding RowCancelingEdit methods etc it has stopped.
What is it thats making the 'Name' value Null?
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
GridViewRow row = (GridViewRow)GridView1.Rows[e.RowIndex];
String qry = "UPDATE [PlayerStatistics] SET [Name] = @Name, [Apps] = @Apps, [Minutes] = @Minutes, [Goals] = @Goals, [Assists] = @Assists, [Yellows] = @Yellows, [Reds] = @Reds WHERE [PlayerID] = @original_PlayerID";
using (SqlCommand cmd = new SqlCommand(qry, con))
{
cmd.Parameters.AddWithValue("@Name", SqlDbType.VarChar);
cmd.Parameters.AddWithValue("@Apps", SqlDbType.Int);
cmd.Parameters.AddWithValue("@Minutes", SqlDbType.Int);
cmd.Parameters.AddWithValue("@Goals", SqlDbType.Int);
cmd.Parameters.AddWithValue("@Assists", SqlDbType.Int);
cmd.Parameters.AddWithValue("@Yellows", SqlDbType.Int);
cmd.Parameters.AddWithValue("@Reds", SqlDbType.Int);
cmd.Parameters.AddWithValue("@original_PlayerID", SqlDbType.Int);
cmd.CommandType = CommandType.Text;
con.Open();
cmd.ExecuteNonQuery();
}
}
Markup:
<asp:GridView ID="GridView1" runat="server" AllowSorting="True" AutoGenerateColumns="False" DataKeyNames="PlayerID" DataSourceID="SqlDataSource1" EmptyDataText="Please enter player(s) into the table." OnRowDeleted="GridView1_RowDeleted" OnRowDeleting="GridView1_RowDeleting1" Width="100%" OnRowUpdating="GridView1_RowUpdating" OnRowCancelingEdit="GridView1_RowCancelingEdit">
<Columns>
<asp:BoundField DataField="Name" HeaderText="Name" ReadOnly="True" SortExpression="Name" >
<ControlStyle Width="100%" />
</asp:BoundField>
<asp:BoundField DataField="Apps" HeaderText="Apps" SortExpression="Apps" >
<ControlStyle Width="100%" />
</asp:BoundField>
<asp:BoundField DataField="Minutes" HeaderText="Minutes" SortExpression="Minutes" >
<ControlStyle Width="100%" />
</asp:BoundField>
<asp:BoundField DataField="Goals" HeaderText="Goals" SortExpression="Goals" >
<ControlStyle Width="100%" />
</asp:BoundField>
<asp:BoundField DataField="Assists" HeaderText="Assists" SortExpression="Assists" ControlStyle-Width="100%" >
<ControlStyle Width="100%" />
</asp:BoundField>
<asp:BoundField DataField="Yellows" HeaderText="Yellows" SortExpression="Yellows" >
<ControlStyle Width="100%" />
</asp:BoundField>
<asp:BoundField DataField="Reds" HeaderText="Reds" SortExpression="Reds" >
<ControlStyle Width="100%" />
</asp:BoundField>
<asp:TemplateField HeaderText ="Edit/Delete">
<ItemTemplate>
<asp:LinkButton ID="BtnEdit" runat="server" CausesValidation="false" CommandName="Edit" Text="Edit" />
<span onclick="return confirm ('Are you Sure?')" >
<asp:LinkButton ID="BtnDelete" runat="server" CausesValidation="False" CommandName="Delete" Text="Delete"/>
</span>
</ItemTemplate>
<EditItemTemplate>
<asp:Button ID="BtnUpdate" runat="server" CausesValidation="false" CommandName="Update" ConflictDetection="OverwriteChanges" Text="Update" />
<asp:Button ID="BtnCancel" runat="server" CausesValidation="false" CommandName="Cancel" ConflictDetection="OverwriteChanges" Text="Cancel" />
</EditItemTemplate>
<ControlStyle Width="100%" />
</asp:TemplateField>
</Columns>
</asp:GridView>
Updated code
Using a stored procedure:
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
GridViewRow row = (GridViewRow)GridView1.Rows[e.RowIndex];
//String qry = "UPDATE [PlayerStatistics] SET [Name] = @Name, [Apps] = @Apps, [Minutes] = @Minutes, [Goals] = @Goals, [Assists] = @Assists, [Yellows] = @Yellows, [Reds] = @Reds WHERE [PlayerID] = @original_PlayerID";
using (SqlCommand cmd = new SqlCommand("UpdatePlayer", con))
{
//cmd.Parameters.AddWithValue("@Name", GridView1.DataKeys[e.RowIndex].Values["Name"]);
//cmd.Parameters.AddWithValue("@Name", SqlDbType.VarChar);
cmd.Parameters.AddWithValue("@Apps", e.NewValues["Apps"]);
cmd.Parameters.AddWithValue("@Minutes", e.NewValues["Minutes"]);
cmd.Parameters.AddWithValue("@Goals", e.NewValues["Goals"]);
cmd.Parameters.AddWithValue("@Assists", e.NewValues["Assists"]);
cmd.Parameters.AddWithValue("@Yellows", e.NewValues["Yellows"]);
cmd.Parameters.AddWithValue("@Reds", e.NewValues["Reds"]);
cmd.Parameters.AddWithValue("@PlayerID", GridView1.DataKeys[e.RowIndex].Values["PlayerID"]);
cmd.CommandType = CommandType.StoredProcedure;
con.Open();
cmd.ExecuteNonQuery();
}
GridView1.EditIndex = -1;
GridView1.DataBind();
}
回答1:
The second argument of AddWithValue is the value, not the data type. And since the Name field is not editable in your GridView, you can remove it from the update query and from the parameters. Your event handler would look like this:
using (SqlCommand cmd = new SqlCommand("UpdatePlayer", con))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@PlayerID", GridView1.DataKeys[e.RowIndex].Values["PlayerID"]);
cmd.Parameters.AddWithValue("@Apps", e.NewValues["Apps"]);
cmd.Parameters.AddWithValue("@Minutes", e.NewValues["Minutes"]);
...
}
You should also bind the data to the GridView and reset the EditRowIndex at the end of the RowUpdating event handler:
GridView1.EditIndex = -1;
BindData();
来源:https://stackoverflow.com/questions/36488044/gridview-field-empties-on-rowupdating-command