尝试更新GridView数据时,它成功运行,但它获取旧数据而不是您在文本框中键入的数据。
这就是我所拥有的:
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
string name = ((TextBox)(GridView1.Rows[e.RowIndex].Cells[1].Controls[0])).Text;
string phone = ((TextBox)(GridView1.Rows[e.RowIndex].Cells[2].Controls[0])).Text;
string email = ((TextBox)(GridView1.Rows[e.RowIndex].Cells[3].Controls[0])).Text;
int contactId = Convert.ToInt32(((TextBox)(GridView1.Rows[e.RowIndex].Cells[4].Controls[0])).Text);
objLogic.UpdateContact(name, phone, email, contactId); //passes values to SQL to update database
GridView1.EditIndex = -1;
GridView1.DataBind();
}
和
protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
{
GridView1.EditIndex = e.NewEditIndex;
GridView1.DataBind();
}
和
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
DropDownList1.DataSource = objLogic.LoadClient();
DropDownList1.DataTextField = "name";
DropDownList1.DataValueField = "clientId";
DropDownList1.DataBind();
}
GridView1.DataSource = objLogic.LoadContacts(Convert.ToInt16(DropDownList1.SelectedValue));
GridView1.DataBind();
例如,当前数据为:
姓名:Blake,电话:123-234-3456,电子邮件:test @ test.com,contactId:22
我输入新数据:
姓名:John,电话:555-555-5555,电子邮件:test2@test2.com,contactId:22
最终在数据库中的数据:
姓名:Blake,电话:123-234-3456,电子邮件:test @ test.com,contactId:22
答案 0 :(得分:4)
当您引发RowUpdating事件时,您基本上会在GridView更新行之前获取值。这基本上是您可以取消更新操作。要获得您输入的内容,我认为您需要获取新值(在您的情况下为Dictionary e.NewValues())。
在您的情况下,您可以使用类似这样的内容(假设姓名,电话和电子邮件是您在gridview中调用的内容):
foreach(DictionaryEntry de in e.NewValues())
{
string name = de.FirstOrDefault(x => x.Key == "name").Value;
string phone = de.FirstOrDefault(x => x.Key == "phone").Value;
string email = de.FirstOrDefault(x => x.Key == "email").Value;
}
注意:如果您只是使用它来获取输入的值来更新数据库,那么您最好绑定数据网格并使用之后的值以确保您在数据网格中确实具有相同的值你把什么放进了数据库。或者,使用RowUpdated事件而不是RowUpdating事件。
答案 1 :(得分:4)
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
DropDownList1.DataSource = objLogic.LoadClient();
DropDownList1.DataTextField = "name";
DropDownList1.DataValueField = "clientId";
DropDownList1.DataBind();
BindGrid();
}
}
protected void BindGrid()
{
GridView1.DataSource = objLogic.LoadContacts(Convert.ToInt16(DropDownList1.SelectedValue));
GridView1.DataBind();
}
每次页面回发时都会重新绑定网格。将网格的绑定移动到单独的函数中。执行行更新后,重新绑定网格。
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
string name = ((TextBox)(GridView1.Rows[e.RowIndex].Cells[1].Controls[0])).Text;
string phone = ((TextBox)(GridView1.Rows[e.RowIndex].Cells[2].Controls[0])).Text;
string email = ((TextBox)(GridView1.Rows[e.RowIndex].Cells[3].Controls[0])).Text;
int contactId = Convert.ToInt32(((TextBox)(GridView1.Rows[e.RowIndex].Cells[4].Controls[0])).Text);
objLogic.UpdateContact(name, phone, email, contactId); //passes values to SQL to update database
GridView1.EditIndex = -1;
BindGrid();
}
编辑时,您也必须调用BindGrid。
protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
{
GridView1.EditIndex = e.NewEditIndex;
//GridView1.DataBind(); this is meaningless, you have not set a DataSource
BindGrid();
}
答案 2 :(得分:2)
最普遍的原因是我们通常忘记检查Page Load事件中的回发。 检查回发后,问题将被删除。
if (! IsPostBack)
{
readData();
...
}
答案 3 :(得分:0)
Prokzy
我只有你的榜样,做这样的事情对我来说很好。注意DataSource部分。我有一个DataSet实例化为aDataSet btw
protected void GridView1_GridViewPageEventArgs e(object sender, GridViewPageEventArgs e)
{
GridView1.EditIndex = e.NewPageIndex;
GridView1.DataSource = null;
GridView1.DataSource = aDataset;
GridView1.DataBind();
}
答案 4 :(得分:0)
您需要再次调用LoadContacts并在更新数据库后重新分配GridView1.DataSource。目前,DataSource尚未更新 - 并且只是使用在行更新之前检索的集合。