我对asp.net比较新。如果我的疑问很幼稚,请耐心等待 我的网格设计:
<asp:GridView runat ="server" GridLines = "Both" DataKeyNames="book_id"AutoGenerateColumns ="false" CellPadding ="5" CellSpacing ="5" allowpaging="True" allowsorting="True"
ID="gv_table1" EmptyDataText ="No data exists" OnRowEditing="gv_RowEditing"
OnRowCancelingEdit="gv_RowCancelingEdit" OnRowUpdating="gv_RowUpdating" OnRowDeleting="gv_RowDeleting">
<Columns>
<asp:BoundField HeaderText="Book ID" DataField="book_id">
</asp:BoundField>
<asp:BoundField DataField="book_name" HeaderText="Book Name">
</asp:BoundField>
<asp:BoundField DataField="author_name" HeaderText="Author Name">
</asp:BoundField>
<asp:BoundField DataField="publisher" HeaderText="Publisher">
</asp:BoundField>
<asp:BoundField DataField="year_edition" HeaderText="Year/Edition">
</asp:BoundField>
<asp:BoundField DataField="total_no" HeaderText="Total No">
</asp:BoundField>
<asp:BoundField DataField="available" HeaderText="Available">
</asp:BoundField>
<asp:BoundField DataField="tags" HeaderText="Tags">
</asp:BoundField>
<asp:BoundField DataField="fare" HeaderText="Fare">
</asp:BoundField>
<asp:BoundField DataField="state" HeaderText="State">
</asp:BoundField>
<asp:templatefield HeaderText ="Options">
<itemtemplate >
<asp:linkbutton id="btnEdit" runat="server" commandname="Edit" text="Edit" />
<asp:linkbutton id="btnDelete" runat="server" commandname="Delete" text="Delete" />
</itemtemplate>
<edititemtemplate>
<asp:linkbutton id="btnUpdate" runat="server" commandname="Update" text="Update" />
<asp:linkbutton id="btnCancel" runat="server" commandname="Cancel" text="Cancel" />
</edititemtemplate>
</asp:templatefield>
</Columns>
</asp:GridView>
我的代码背后:
public void gv_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
int bookid = Convert.ToInt32(gv_table1.DataKeys[e.RowIndex].Values["book_id"].ToString());
string bookname =(gv_table1.Rows[e.NewValues].Cells[1].Controls[0] as TextBox).Text;
string bookname = (gv_table1.Rows[e.RowIndex].FindControl("author_name") as TextBox).Text;
string book = gv_table1.Rows[e.RowIndex].Cells[1].Text ;
}
我可以删除但不能编辑数据。我无法获取我在网格视图中输入的更改值。我尽力让我在编辑或更改之前获得gridview中的值。 在此先感谢朋友们。
答案 0 :(得分:5)
我认为我们不能使用Find控制方法访问绑定字段。 author_name
是绑定的feild中使用FindControl无法访问它的数据字段的名称,它不是控件。
使用e.RowIndex获取更新的值。
public void gv_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
string bookname = ((TextBox)(gv_table1.Rows[e.RowIndex].Cells[1].Controls[0])).Text;
// OR
string bookname =(gv_table1.Rows[e.RowIndex].Cells[1].Controls[0] as TextBox).Text;
gv_table1.EditIndex = -1; // reset the edit index
// Again Bind the gridview to show updated data
}
更新答案:
<强>问题:强>
The problem is that you are binding your gridview on each post back
<强>解决方案:强>
为了测试它,我创建了一个gridview添加两列,如果我在每个回发上绑定gridview,我会得到旧值。为了避免这种情况,只需在绑定网格之前添加Page.IsPostBack
检查。
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack) // If you not place this check then you will get the old values because GridView in Bind on every postback
{
BindGrid(); // Bind you grid here
}
}
我的完整代码:
// Aspx Code
<asp:GridView ID="GridView1" AutoGenerateColumns="false" runat="server"
AllowPaging="True"
onrowediting="GridView1_RowEditing" onrowupdating="GridView1_RowUpdating" onrowcancelingedit="GridView1_RowCancelingEdit"
>
<Columns>
<asp:BoundField DataField="Name" HeaderText="Name" />
<asp:BoundField DataField="City" HeaderText="Name" />
<asp:CommandField ShowEditButton ="true" ShowCancelButton="true" ShowDeleteButton="true" />
</Columns>
</asp:GridView>
// Aspx Code Behind
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack) // If you not place this check then you will get the old values because GridView in Bind on every postback
{
BindGrid();
}
}
private void BindGrid() // function for binding gridview
{
DataTable dt = new DataTable();
dt.Columns.Add("Name");
dt.Columns.Add("City");
DataRow r = dt.NewRow();
r[0] = "Name 1";
r[1] = "City 1";
DataRow r1 = dt.NewRow();
r1[0] = "Name 2";
r1[1] = "City 2";
dt.Rows.Add(r);
dt.Rows.Add(r1);
GridView1.DataSource = dt;
GridView1.DataBind();
}
protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
{
GridView1.EditIndex = e.NewEditIndex; // setting new index
BindGrid();
}
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
GridViewRow row = GridView1.Rows[e.RowIndex];
string newvalue = ((TextBox)row.Cells[0].Controls[0]).Text;
GridView1.EditIndex = -1; // Again reset
}
protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
{
GridView1.EditIndex = -1; // reseting grid view
BindGrid();
}
答案 1 :(得分:1)
而不是boundfiled
,我更喜欢使用简单的TemplateField
。
经过测试的示例代码: 从页脚添加新记录并更新所选行
<强> Default.aspx的:强>
<asp:GridView ID="gvstatus" runat="server" AutoGenerateColumns="False"
CellPadding="4" ForeColor="#333333" GridLines="None"
onrowcancelingedit="gvstatus_RowCancelingEdit"
onrowediting="gvstatus_RowEditing" onrowupdating="gvstatus_RowUpdating"
onselectedindexchanged="gvstatus_SelectedIndexChanged" ShowFooter="True"
onrowcommand="gvstatus_RowCommand" Width="600px" AllowPaging="True"
onpageindexchanging="gvstatus_PageIndexChanging">
<Columns>
<asp:TemplateField HeaderText="SrNo " HeaderStyle-HorizontalAlign="Left">
<ItemTemplate>
<%# Container.DataItemIndex + 1 %>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="ID" Visible="false">
<ItemTemplate>
<asp:Label ID="lblid" runat="server" Text='<%# Bind("columnname_id") %>'> </asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="EmpName">
<ItemTemplate>
<asp:Label ID="lblEmpName" runat="server" Text='<%# Bind("columnname_EmpName") %>'></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="txtEmpName" runat="server" Text='<%# Bind("columnname_EmpName") %>'></asp:TextBox>
</EditItemTemplate>
<FooterTemplate>
<asp:TextBox ID="txtfEmpName" runat="server"></asp:TextBox>
</FooterTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="empSalary" >
<ItemTemplate>
<asp:Label ID="lblempSalary" runat="server" Text='<%# Bind("columnname_EmpSalary") %>'></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="txtempSalary" runat="server" Text='<%# Bind("columnname_EmpSalary") %>'></asp:TextBox>
</EditItemTemplate>
<FooterTemplate>
<asp:TextBox ID="txtfempSalary" runat="server" ></asp:TextBox>
</FooterTemplate>
</asp:TemplateField>
<asp:TemplateField ShowHeader="False" ItemStyle-Width="190px">
<ItemTemplate>
<asp:Button ID="btnedit" runat="server" CausesValidation="False"
CommandName="Edit" Text="Edit"></asp:Button>
</ItemTemplate>
<EditItemTemplate>
<asp:Button ID="btnupdate" runat="server" CausesValidation="True"
CommandName="Update" Text="Update"></asp:Button>
<asp:Button ID="btncancel" runat="server" CausesValidation="False"
CommandName="Cancel" Text="Cancel"></asp:Button>
</EditItemTemplate>
<FooterTemplate>
<asp:Button ID="btnadd" runat="server" Text="Add" CommandName="Add" />
</FooterTemplate>
</asp:TemplateField>
</Columns>
<PagerStyle BackColor="#A86E07" ForeColor="White" HorizontalAlign="Center" />
<SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" />
<HeaderStyle BackColor="#A86E07" Font-Bold="True" ForeColor="White" />
<EditRowStyle BackColor="#d9d9d9" />
<AlternatingRowStyle BackColor="White" ForeColor="#A86E07" />
</asp:GridView>
<强>代码隐藏:强>
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
gvBind(); //Bind gridview
}
}
public void gvBind()
{
SqlDataAdapter dap = new SqlDataAdapter("select id, empName,empSalary from myTable", conn);
DataSet ds = new DataSet();
dap.Fill(ds);
gvstatus.DataSource = ds.Tables[0];
gvstatus.DataBind();
}
protected void gvstatus_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
//Update the select row from girdview
lblmsg.Text = "";
try
{
GridViewRow row = (GridViewRow)gvstatus.Rows[e.RowIndex];
Label lblid = (Label)gvstatus.Rows[e.RowIndex].FindControl("lblid");
TextBox txtname = (TextBox)gvstatus.Rows[e.RowIndex].FindControl("txtEmpName");
TextBox txtSalary = (TextBox)gvstatus.Rows[e.RowIndex].FindControl("txtempSalary");
string empName = txtname.Text;
string empSalary = txtSalary.Text;
string lblID=lblid.Text;
int result = UpdateQuery(empName, empSalary,lblID);
if (result > 0)
{
lblmsg.Text = "Record is updated successfully.";
}
gvstatus.EditIndex = -1;
gvBind();
}
catch (Exception ae)
{
Response.Write(ae.Message);
}
}
protected void gvstatus_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
{
gvstatus.EditIndex = -1;
gvBind();
}
protected void gvstatus_RowEditing(object sender, GridViewEditEventArgs e)
{
lblmsg.Text = "";
gvstatus.EditIndex = e.NewEditIndex;
gvBind();
}
protected void gvstatus_RowCommand(object sender, GridViewCommandEventArgs e)
{
//Add new record to database form girdview footer
if (e.CommandName == "Add")
{
string empName = ((TextBox)gvstatus.FooterRow.FindControl("txtfempName")).Text;
string empSalry = ((TextBox)gvstatus.FooterRow.FindControl("txtfempSalary")).Text;
int result = InsertNewRecord(empName, empSalry);
if (result > 0)
{
lblmsg.Text = "Record is added successfully.";
}
gvstatus.EditIndex = -1;
gvBind();
}
}
public void UpdateQuery(string empName, string empSalary, string lblID)
{
SqlCommand cmd = new SqlCommand("update myTable set empName='" + empName + "',empSalary='" + empSalary + "' where id='" + lblID + "'", conn);
conn.Open();
int temp = cmd.ExecuteNonQuery();
conn.Close();
return temp;
}
public void InsertNewRecord(string empName, string empSalary)
{
SqlCommand cmd = new SqlCommand("your insert query ", conn);
conn.Open();
int temp = cmd.ExecuteNonQuery();
conn.Close();
return temp;
}
http://satindersinght.blogspot.in/2012/08/how-to-addupdate-record-using-gridview.html
如果您觉得有帮助,请标记答案:)
答案 2 :(得分:0)
我为你写了所有的代码,即使你可能不需要它。希望您可以从中学习并应用于您的。但是这段代码确实有效。但首先,如果我是你,我会为书籍ID创建一个项目模板并将其作为标签。那将是你的控制。您还需要使用参数来防止sql注入。有很多方法可以做到这一点,但这就是我这样做的方式。希望它会有所帮助。
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
//Identify your control i.e. the primary key (lblbookid is the name of the item template)
GridViewRow row = GridView1.Rows[e.RowIndex];
Label bookidLabel = (Label)row.FindControl("lblbookid");
//connect to db which you probably already have
string strSQLConnection = ("server=blah;database=blah;uid=blah;pwd=blah");
SqlConnection sqlConnection = new SqlConnection(strSQLConnection);
SqlCommand cmd = new SqlCommand();
cmd.CommandText = "UPDATE yourtable SET book_name = @book_name WHERE book_id = @book_id";
//parameters
cmd.Parameters.Add("@bookid", SqlDbType.Char).Value = bookidLabel.Text;
cmd.Parameters.Add("@book_name", SqlDbType.Char).Value = ((TextBox)GridView1.Rows[e.RowIndex].Cells[2].Controls[0]).Text;
cmd.Parameters.Add("@book_author", SqlDbType.Char).Value = ((TextBox)GridView1.Rows[e.RowIndex].Cells[3].Controls[0]).Text;
cmd.Connection = sqlConnection;
sqlConnection.Open();
cmd.ExecuteNonQuery();
sqlConnection.Close();
GridView1.EditIndex = -1;
BindData();
}