由于需要我对gridview进行了动态绑定(用代码)发现当绑定列使用boundfield时,gridview运行正常;
当绑定列使用templatefield时,gridview在编辑状态下无法更新,但编辑,取消都没有问题。
(使用templatefield是为了添加dropdownlist)后加断点发现,无论点更新或取消都会触发RowCancelingEdit事件,而不会触发rowupating事件。查了csdn的一些方法,都没解决问题。求助啊!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
当绑定列使用templatefield时,gridview在编辑状态下无法更新,但编辑,取消都没有问题。
(使用templatefield是为了添加dropdownlist)后加断点发现,无论点更新或取消都会触发RowCancelingEdit事件,而不会触发rowupating事件。查了csdn的一些方法,都没解决问题。求助啊!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
<EditItemTemplate>
<asp:DropDownList ID="ddlRight" runat="server">
<asp:ListItem>主持</asp:ListItem>
<asp:ListItem>出席</asp:ListItem>
</asp:DropDownList>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="labRight" runat="server" Text='<%# Bind("UserRight") %>' />
</ItemTemplate>
</asp:TemplateField>
后台用((DropDownList)this.gvUsers.Rows[e.RowIndex].Cells[x].Controls[x]).SelectedValue获取updating成功和canceling事件都要写gridview.EditIndex=-1
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Data;public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
Bind();
}
} private void Bind()
{
SqlConnection con = new SqlConnection("server=192.9.200.100.;database=test;uid=sa;pwd=123456");
con.Open();
SqlDataAdapter sa = new SqlDataAdapter("select * from table1",con);
DataSet ds = new DataSet();
sa.Fill(ds, "tmp");
con.Close();
GridView1.Columns.Clear();
GridView1.DataSource = ds.Tables["tmp"];
GridView1.DataKeyNames = new string[] { "id" };
GridView1.AutoGenerateColumns = false; BoundField bf = new BoundField();
bf.DataField = "id";
bf.HeaderText = "编号";
GridView1.Columns.Add(bf); BoundField bf2 = new BoundField();
bf2.DataField = "name";
bf2.HeaderText = "名称";
GridView1.Columns.Add(bf2); CommandField edit = new CommandField();
edit.ShowEditButton = true;
edit.CausesValidation = false;
GridView1.Columns.Add(edit); GridView1.DataBind(); }
protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
{
GridView1.EditIndex = e.NewEditIndex;
Bind();
}
protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
{
//加断点正常触发
} protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
//加断点正常触发
}
}
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Data;public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
Bind();
}
} private void Bind()
{
SqlConnection con = new SqlConnection("server=192.9.200.100.;database=test;uid=sa;pwd=123456");
con.Open();
SqlDataAdapter sa = new SqlDataAdapter("select * from table1",con);
DataSet ds = new DataSet();
sa.Fill(ds, "tmp");
con.Close();
GridView1.Columns.Clear();
GridView1.DataSource = ds.Tables["tmp"];
GridView1.DataKeyNames = new string[] { "id" };
GridView1.AutoGenerateColumns = false; TemplateField tf = new TemplateField();
tf.ItemTemplate = new myTemplate(1,"id","");
tf.EditItemTemplate= new myTemplate(2,"id","");
tf.HeaderText="编号";
GridView1.Columns.Add(tf); TemplateField tf2 = new TemplateField();
tf2.ItemTemplate = new myTemplate(1,"name","");
tf2.EditItemTemplate= new myTemplate(2,"name","");
tf2.HeaderText="名称";
GridView1.Columns.Add(tf2);
CommandField edit = new CommandField();
edit.ShowEditButton = true;
edit.CausesValidation = false;
GridView1.Columns.Add(edit); GridView1.DataBind(); }
protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
{
GridView1.EditIndex = e.NewEditIndex;
Bind();
}
protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
{
//加断点:无论点击更新取消都触发该事件
} protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
//加断点:无论点击更新取消都无法触发该事件
}}public class myTemplate : ITemplate
{
int colType = 1;
string colStr = string.Empty;
string colList = string.Empty; public myTemplate(int tmpType, string tmpStr, string tmpList)
{
colType = tmpType;
colStr = tmpStr;
colList = tmpList;
} public void InstantiateIn(Control container)
{
switch (colType)
{
case 1:
Label l = new Label();
l.DataBinding += new EventHandler(this.labelDataBinding);
container.Controls.Add(l);
break;
case 2:
TextBox tb = new TextBox();
tb.DataBinding += new EventHandler(this.textboxDataBinding);
container.Controls.Add(tb);
break;
case 3:
DropDownList ddl = new DropDownList();
ddl.DataBinding += new EventHandler(this.dropdownlistDataBinging);
container.Controls.Add(ddl);
break;
default:
break;
}
} public void labelDataBinding(object sender, EventArgs e)
{
Label l = (Label)sender;
GridViewRow container = (GridViewRow)l.NamingContainer;
l.Text = ((DataRowView)container.DataItem)[colStr].ToString();
} public void textboxDataBinding(object sender, EventArgs e)
{
TextBox tb = (TextBox)sender;
GridViewRow container = (GridViewRow)tb.NamingContainer;
tb.Text = ((DataRowView)container.DataItem)[colStr].ToString();
} public void dropdownlistDataBinging(object sender, EventArgs e)
{
string[] myItem;
myItem = colList.Split('|');
DropDownList ddl = (DropDownList)sender;
GridViewRow container = (GridViewRow)ddl.NamingContainer;
for (int i = 0; i < myItem.Length; i++)
{
ddl.Items.Add(myItem[i]);
if (myItem[i] == ((DataRowView)container.DataItem)[colStr].ToString())
{
ddl.SelectedValue = myItem[i].ToString();
}
}
}
}
现在的问题是根本不会触发updating事件我updating和canceling都没加代码,我只测试触发那个事件触发都错了,写了也白写,另外我看了下gridview的事件也没丢失。感觉问题应该在template类里,可是网上的template类例子大多都这么写的啊!