|
Sorry that didn't work. It started loaded at the second record. and loaded the database with that record only.
|
|
|
|
|
|
protected void gvKeyPersonnel_RowUpdating(object sender, EventArgs e)
{
int @ID = Convert.ToInt32(gvKeyPersonnel.DataKeys[0].Value.ToString());
TextBox @Name = (TextBox)gvKeyPersonnel.Rows[0].FindControl("txtName");
TextBox @VDCIDIQ = (TextBox)gvKeyPersonnel.Rows[1].FindControl("txtVDCIDIQ");
TextBox @VDCFFS = (TextBox)gvKeyPersonnel.Rows[2].FindControl("txtVDCFFS");
TextBox @VDCHIM = (TextBox)gvKeyPersonnel.Rows[3].FindControl("txtVDCHIM");
TextBox @VDCWEBHOSTING = (TextBox)gvKeyPersonnel.Rows[4].FindControl("txtVDCWEBHOSTING");
TextBox @VDCCWF = (TextBox)gvKeyPersonnel.Rows[5].FindControl("txtVDCCWF");
using (SqlCommand cmd = new SqlCommand())
{
cmd.Connection = conn;
conn.Open();
foreach (GridViewRow row in gvKeyPersonnel.Rows)
{
cmd.CommandText = @"UPDATE SP2010_EDCStaffing_AppDB.dbo.CMS_Key_Personnel SET Name = @Name, VDCIDIQ = @VDCIDIQ, VDCFFS = @VDCFFS, VDCHIM = @VDCHIM, VDCWEBHOSTING = @VDCWEBHOSTING, VDCCWF = @VDCCWF WHERE ID = @id";
cmd.Parameters.AddWithValue("@id", Convert.ToInt32(gvKeyPersonnel.DataKeys[row.RowIndex].Values[0]));
cmd.Parameters.AddWithValue("@Name", Name.Text);
cmd.Parameters.AddWithValue("@VDCIDIQ", VDCIDIQ.Text);
cmd.Parameters.AddWithValue("@VDCFFS", VDCFFS.Text);
cmd.Parameters.AddWithValue("@VDCHIM", VDCHIM.Text);
cmd.Parameters.AddWithValue("@VDCWEBHOSTING", VDCWEBHOSTING.Text);
cmd.Parameters.AddWithValue("@VDCCWF", VDCCWF.Text);
cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
}
conn.Close();
}
|
|
|
|
|
Whoah. Okay, that's really not going to work. You load the TextBoxes with one set of values and then you assign them on each iteration through the foreach. That's just going to set the values to the same values and I doubt that's what you want. You need to stop and have a think about what you're trying to achieve rather than just throwing things together in the hope that they will work. Write out the steps on a bit of paper and then code that up.
Drop the TextBox approach here - it's just not going to work.
|
|
|
|
|
Okay thanks. I am a newbie to C#. Don't I need to use Label instead of TextBox in ASP.Net GridView control?
|
|
|
|
|
It seems you have two separate issues that you're trying to fix here. The first is how to save the data from your GridView and the second one is how to display it/edit it. Is that correct?
Let's solve the first one - by assuming that you have somehow managed to display and edit the data back into the GridView. If we assume that, then you use the approach I outlined to perform your save. Don't try to save directly off the TextBoxes as that only applies to saving a single row. So, follow the code I outlined using the value in cell 0 to get your Id and save off that.
|
|
|
|
|
Yes I can display my Gridview and edit it. When I click update that is where the issue is?
You told me to cmd.Parameters.Clear(); Should that be in the foreach loop?
protected void gvKeyPersonnel_RowUpdating(object sender, EventArgs e)
{
using (SqlCommand cmd = new SqlCommand())
{
cmd.Connection = conn;
conn.Open();
foreach (GridViewRow row in gvKeyPersonnel.Rows)
{
cmd.Parameters.Clear();
cmd.CommandText = @"UPDATE SP2010_EDCStaffing_AppDB.dbo.CMS_Key_Personnel SET Name = @Name, VDCIDIQ = @VDCIDIQ, VDCFFS = @VDCFFS, VDCHIM = @VDCHIM, VDCWEBHOSTING = @VDCWEBHOSTING, VDCCWF = @VDCCWF WHERE ID = @id";
cmd.ExecuteNonQuery();
cmd.Parameters.AddWithValue("@id", row.Cells[0].Text);
cmd.Parameters.AddWithValue("@Name", row.Cells[1].Text);
cmd.Parameters.AddWithValue("@VDCIDIQ", row.Cells[2].Text);
cmd.Parameters.AddWithValue("@VDCFFS", row.Cells[3].Text);
cmd.Parameters.AddWithValue("@VDCHIM", row.Cells[4].Text);
cmd.Parameters.AddWithValue("@VDCWEBHOSTING", row.Cells[5].Text);
cmd.Parameters.AddWithValue("@VDCCWF", row.Cells[6].Text);
}
conn.Close();
}
}
I must be missing something here? Thanks for your help and looking at it?
|
|
|
|
|
Yes it should. You need that to ensure you don't try and add the same parameters in again.
|
|
|
|
|
While in debug, I don't see any values in the fields? When I update all fields except the ID is deleted in the database. Don't I have to set the parameters first before using cmd.Parameters.AddWithValue?
|
|
|
|
|
Ta da!
You are executing the command "before" adding the parameters. Move
cmd.ExecuteNonQuery(); line after you have added the parameters. Also a tip:
Hope this helps.
You have just been Sharapova'd.
|
|
|
|
|
I have the cmd.ExecuteNonQuery(); at the end But by removing the foreach loop and adding
GridViewRow row = gvKeyPersonnel.Rows[e.RowIndex]; is giving me an error on RowIndexand if I put row instead of e it gives me a error on row. I still don't see any values in the debug. I have spend 5 days on this one and still don't see what is wrong.
protected void gvKeyPersonnel_RowUpdating(object sender, EventArgs e)
{
using (SqlCommand cmd = new SqlCommand())
{
cmd.Connection = conn;
conn.Open();
GridViewRow row = gvKeyPersonnel.Rows[e.RowIndex];
{
cmd.CommandText = "UPDATE SP2010_EDCStaffing_AppDB.dbo.CMS_Key_Personnel SET Name = @Name, VDCIDIQ = @VDCIDIQ, VDCFFS = @VDCFFS, VDCHIM = @VDCHIM, VDCWEBHOSTING = @VDCWEBHOSTING, VDCCWF = @VDCCWF WHERE ID = @id";
cmd.Parameters.AddWithValue("@id", Convert.ToInt32(gvKeyPersonnel.DataKeys[row.RowIndex].Values[0]));
cmd.Parameters.AddWithValue("@Name", row.Cells[1].Text);
cmd.Parameters.AddWithValue("@VDCIDIQ", row.Cells[2].Text);
cmd.Parameters.AddWithValue("@VDCFFS", row.Cells[3].Text);
cmd.Parameters.AddWithValue("@VDCHIM", row.Cells[4].Text);
cmd.Parameters.AddWithValue("@VDCWEBHOSTING", row.Cells[5].Text);
cmd.Parameters.AddWithValue("@VDCCWF", row.Cells[6].Text);
cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
}
conn.Close();
}
}
|
|
|
|
|
Sorry, I should have mentioned this before.
If the gvKeyPersonnel_RowUpdating() method/handler is for OnRowUpdating event of the gridview (which looks like is), i.e. if you have the following property for your grid (in .aspx) :
OnRowUpdating="gvKeyPersonnel_RowUpdating" , then change the method's signature from
protected void gvKeyPersonnel_RowUpdating(object sender, EventArgs e)
to
protected void gvKeyPersonnel_RowUpdating(object sender, GridViewUpdateEventArgs e)
That should do.
You have just been Sharapova'd.
|
|
|
|
|
Yes I have OnRowUpdating="gvKeyPersonnel_RowUpdating property for my grid in aspx. Should I still removed foreach (GridViewRow row in gvKeyPersonnel.Rows). By the way how will it transverse through the datagridview with it?
|
|
|
|
|
Norris Chappell wrote: Should I still removed foreach (GridViewRow row in gvKeyPersonnel.Rows). Yes, you should.
When you update any of the rows, it will fire up OnRowUpdating event of the grid and gvKeyPersonnel_RowUpdating() event handler will be called. Note that, since the event is firing up "only" for the row you are updating, you should only do the things related to that row (note that I said you "should" ).
Now for your question:
Norris Chappell wrote: By the way how will it transverse through the datagridview with it? The answer is simple - you don't want to traverse through every row in the grid since you are updating only one (for which the event is fired) at any given time.
Related: If you don't have it already, you may want to have a look at OnRowUpdated[^] event as well.
You have just been Sharapova'd.
|
|
|
|
|
Thanks for pointing that out to me. One last thing do my parameters look right. Should I I removed this too? cmd.Parameters.Clear();
|
|
|
|
|
I'm getting the following error: No overload for 'gvKeyPersonnel_RowUpdating' matches delegate 'System.EventHandler'
|
|
|
|
|
Norris Chappell wrote: Should I I removed this too? cmd.Parameters.Clear(); Since you are not inside a loop anymore, you may want to remove that line. But that won't matter much as the SqlCommand is going to be disposed anyway (at the end of the using block).
Also, since you are not using the foreach anymore, you may want to remove its "{ }" braces as well, as they are forming an unnecessary code-block at the moment.
You have just been Sharapova'd.
|
|
|
|
|
GridViewRow row = gvKeyPersonnel.Rows[e.RowIndex]; is giving me this error:
it doesn't like the e.RowIndex
'System.Web.UI.WebControls.GridViewUpdatedEventArgs' does not contain a definition for 'RowIndex' and no extension method 'RowIndex' accepting a first argument of type 'System.Web.UI.WebControls.GridViewUpdatedEventArgs' could be found (are you missing a using directive or an assembly reference?)
|
|
|
|
|
If you are using GridViewUpdatedEventArgs e as a parameter to the gvKeyPersonnel_RowUpdating method/handler, then it's wrong. The method signature should look like this:
protected void gvKeyPersonnel_RowUpdating(object sender, GridViewUpdateEventArgs e) that is, you initially had it correct. Note that it's GridViewUpdateEventArgs in the parameter.
Don't get confused. The OnRowUpdating event that you already have should used to perform actual update (this you already have in place), where as the OnRowUpdated event I just suggested should be used to perform something "after" you have updated a row, like notify the user, rebind the grid, etc.
You have just been Sharapova'd.
|
|
|
|
|
Made that change but when I ran my code I got this error again: No overload for 'gvKeyPersonnel_RowUpdating' matches delegate 'System.EventHandler'
|
|
|
|
|
Hmm, not sure. Can you show your grid's markup and "gvKeyPersonnel_RowUpdating" method again?
You have just been Sharapova'd.
|
|
|
|
|
protected void gvKeyPersonnel_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
using (SqlCommand cmd = new SqlCommand())
{
cmd.Connection = conn;
conn.Open();
GridViewRow row = gvKeyPersonnel.Rows[e.RowIndex];
cmd.CommandText = "UPDATE SP2010_EDCStaffing_AppDB.dbo.CMS_Key_Personnel SET Name = @Name, VDCIDIQ = @VDCIDIQ, VDCFFS = @VDCFFS, VDCHIM = @VDCHIM, VDCWEBHOSTING = @VDCWEBHOSTING, VDCCWF = @VDCCWF WHERE ID = @id";
cmd.Parameters.AddWithValue("@id", Convert.ToInt32(gvKeyPersonnel.DataKeys[row.RowIndex].Values[0]));
cmd.Parameters.AddWithValue("@Name", row.Cells[1].Text);
cmd.Parameters.AddWithValue("@VDCIDIQ", row.Cells[2].Text);
cmd.Parameters.AddWithValue("@VDCFFS", row.Cells[3].Text);
cmd.Parameters.AddWithValue("@VDCHIM", row.Cells[4].Text);
cmd.Parameters.AddWithValue("@VDCWEBHOSTING", row.Cells[5].Text);
cmd.Parameters.AddWithValue("@VDCCWF", row.Cells[6].Text);
cmd.ExecuteNonQuery();
}
conn.Close();
}
|
|
|
|
|
<asp:GridView runat="server" ID="gvKeyPersonnel"
AutoGenerateColumns="False" BackColor="White" BorderColor="#DEDFDE" DataKeyNames="ID"
BorderStyle="None" BorderWidth="1px" CellPadding="4" OnRowUpdating="gvKeyPersonnel_RowUpdating"
EnableModelValidation="True" ForeColor="Black" GridLines="Vertical">
<AlternatingRowStyle BackColor="White" />
<Columns>
<asp:TemplateField HeaderText="ID">
<ItemTemplate>
<asp:TextBox runat="server" text='<%#Eval("ID") %>' ID="txtID" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Name">
<ItemTemplate>
<asp:TextBox runat="server" text='<%#Eval("Name") %>' ID="txtName" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="VDCIDIQ">
<ItemTemplate>
<asp:TextBox runat="server" text='<%#Eval("VDCIDIQ") %>' ID="txtVDCIDIQ" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="VDCFFS">
<ItemTemplate>
<asp:TextBox runat="server" text='<%#Eval("VDCFFS") %>' ID="txtVDCFFS" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="VDCHIM">
<ItemTemplate>
<asp:TextBox runat="server" text='<%#Eval("VDCHIM") %>' ID="txtVDCHIM" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="VDCWEBHOSTING">
<ItemTemplate>
<asp:TextBox runat="server" text='<%#Eval("VDCWEBHOSTING") %>' ID="txtVDCWEBHOSTING" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="VDCCWF">
<ItemTemplate>
<asp:TextBox runat="server" text='<%#Eval("VDCCWF") %>' ID="txtVDCCWF" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
<FooterStyle BackColor="#CCCC99" />
<HeaderStyle BackColor="#6B696B" Font-Bold="True" ForeColor="White" />
<PagerStyle BackColor="#F7F7DE" ForeColor="Black" HorizontalAlign="Right" />
<RowStyle BackColor="#F7F7DE" />
<SelectedRowStyle BackColor="#CE5D5A" Font-Bold="True" ForeColor="White" />
</asp:GridView>
<br />
<asp:Button ID="Update" runat="server" onclick="gvKeyPersonnel_RowUpdating" Text="Update" />
|
|
|
|
|
You are using the same event handler for handling ButtonClick event, that's not going to work. GridView's OnRowUpdating requires GridViewUpdateEventArgs type of EventArgs where as a Button's click requires EventArgs . You might get away with casting, but I won't recommend that.
Also, I don't see any anything for handling the "Edit" operation. Note that, you generally have an Update on a grid only if you also have an Edit (AFAIK).
Have a look at this[^] example on MSDN. Also search for something like "ASP.NET GridView inline edit and update." That should clear things up.
All the best.
You have just been Sharapova'd.
|
|
|
|
|
Hi, I have finally got the edit, update and delete to work. However, for the update can you have more than 1 set statement with the update command? I want to thanks everyone for there help and comments.
using System;
using System.Data;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.Sql;
using System.Data.SqlClient;
using System.Configuration;
using System.Web.UI.WebControls.WebParts;
namespace StaffingWebParts.keypernew
{
public partial class keypernewUserControl : UserControl
{
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["SQLStaffingConn"].ConnectionString);
SqlCommand cmd = new SqlCommand();
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
KeyPersonnel();
}
}
protected void KeyPersonnel()
{
conn.Open();
SqlCommand cmd = new SqlCommand("Select id, Name from CMS_Key_Personnel", conn);
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
int count = ds.Tables[0].Rows.Count;
conn.Close();
if (ds.Tables[0].Rows.Count > 0)
{
gvKeyPersonnel.DataSource = ds;
gvKeyPersonnel.DataBind();
}
else
{
ds.Tables[0].Rows.Add(ds.Tables[0].NewRow());
gvKeyPersonnel.DataSource = ds;
gvKeyPersonnel.DataBind();
int columncount = gvKeyPersonnel.Rows[0].Cells.Count;
lblmsg.Text = " No data found !!!";
}
}
protected void gvKeyPersonnel_RowEditing(object sender, GridViewEditEventArgs e)
{
gvKeyPersonnel.EditIndex = e.NewEditIndex;
KeyPersonnel();
}
protected void gvKeyPersonnel_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
int id = Convert.ToInt32(gvKeyPersonnel.DataKeys[e.RowIndex].Value);
TextBox Name = (TextBox)gvKeyPersonnel.Rows[e.RowIndex].FindControl("txtName");
conn.Open();
SqlCommand cmd = new SqlCommand("update CMS_Key_Personnel set Name='" + Name.Text + "' where id=" + id, conn);
cmd.ExecuteNonQuery();
conn.Close();
lblmsg.Text = id + " Updated successfully........ ";
gvKeyPersonnel.EditIndex = -1;
KeyPersonnel();
}
protected void gvKeyPersonnel_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
{
gvKeyPersonnel.EditIndex = -1;
KeyPersonnel();
}
protected void gvKeyPersonnel_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
string id = gvKeyPersonnel.DataKeys[e.RowIndex].Values["id"].ToString();
conn.Open();
SqlCommand cmd = new SqlCommand("delete from CMS_Key_Personnel where id=" + id, conn);
int result = cmd.ExecuteNonQuery();
conn.Close();
if (result == 1)
{
KeyPersonnel();
lblmsg.Text = id + " Deleted successfully....... ";
}
}
protected void gvKeyPersonnel_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
string id = Convert.ToString(DataBinder.Eval(e.Row.DataItem, "id"));
Button lnkbtnresult = (Button)e.Row.FindControl("ButtonDelete");
if (lnkbtnresult != null)
{
lnkbtnresult.Attributes.Add("onclick", "javascript:return deleteConfirm('" + id + "')");
}
}
}
protected void gvKeyPersonnel_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName.Equals("AddNew"))
{
TextBox inid = (TextBox)gvKeyPersonnel.FooterRow.FindControl("inid");
TextBox inname = (TextBox)gvKeyPersonnel.FooterRow.FindControl("inname");
conn.Open();
SqlCommand cmd =
new SqlCommand(
"insert into CMS_Key_Personnel(id, name,) values('" + inid.Text + "', '" + inname.Text + "')", conn);
int result = cmd.ExecuteNonQuery();
conn.Close();
if (result == 1)
{
KeyPersonnel();
lblmsg.Text = inid.Text + " Added successfully...... ";
}
else
{
lblmsg.Text = inid.Text + " Error while adding row.....";
}
}
}
}
}
modified 14-May-15 21:42pm.
|
|
|
|
|