由于需要我对gridview进行了动态绑定(用代码)发现当绑定列使用boundfield时,gridview运行正常;
当绑定列使用templatefield时,gridview在编辑状态下无法更新,但编辑,取消都没有问题。
(使用templatefield是为了添加dropdownlist)后加断点发现,无论点更新或取消都会触发RowCancelingEdit事件,而不会触发rowupating事件。查了csdn的一些方法,都没解决问题。求助啊!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

解决方案 »

  1.   

                    <asp:TemplateField HeaderText="权限">
                        <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
      

  2.   

    BOUNBFIELD代码(运行正确)using System;
    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)
        {
            //加断点正常触发
        }
    }
      

  3.   

    templatefield代码(出现错误)using System;
    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();
                }
            }
        }
    }
      

  4.   


    现在的问题是根本不会触发updating事件我updating和canceling都没加代码,我只测试触发那个事件触发都错了,写了也白写,另外我看了下gridview的事件也没丢失。感觉问题应该在template类里,可是网上的template类例子大多都这么写的啊!