通过按钮向gridview中新增编辑空行:
按钮代码:protected void 添加_Click(object sender, EventArgs e)
    {
        
        string _insert = @"insert into NJXM_YD(nj_id,项目名称,天数,备注,ref_XZYJS_id) values 
                           (nj_id.NEXTVAL,'','','','" + GV_id + "')";
        DbHelperOra.ExecuteSql(_insert);
        ds = DbHelperOra.Query(CommString);
        this.GridView1.EditIndex = ds.Tables[0].Rows.Count-1;
        GVDataBind();
     
    }//功能是点添加时,先在数据库中增加一个空行,填写数据后点更新在把数据库的这条记录更新。
 protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        
         
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            if (e.Row.RowState == DataControlRowState.Edit || e.Row.RowState == (DataControlRowState.Alternate | DataControlRowState.Edit))
            {
                TextBox TB = e.Row.Cells[0].Controls[0] as TextBox;
                TB.Width = Unit.Pixel(200);
                TB = e.Row.Cells[1].Controls[0] as TextBox;
                TB.Width = Unit.Pixel(40);
                TB = e.Row.Cells[2].Controls[0] as TextBox;
                TB.Width = Unit.Pixel(40);            }
        }
    }数据帮定:
 CommString = "select * from 申报_NJXM_YD where ref_XZYJS_id = '" + GV_id + "'";
            ds = DbHelperOra.Query(CommString);
            if (ds.Tables[0].Rows.Count == 0)
            {                ds.Tables[0].Rows.Add(ds.Tables[0].NewRow());                GridView1.DataSource = ds;                GridView1.DataBind();               int columnCount = GridView1.Rows[0].Cells.Count;                GridView1.Rows[0].Cells.Clear();                GridView1.Rows[0].Cells.Add(new TableCell());                GridView1.Rows[0].Cells[0].ColumnSpan = columnCount;                GridView1.Rows[0].Cells[0].Text = "No   Records   Found. ";            }            else
            {
                GridView1.DataSource = ds;                GridView1.DataBind();            }
调试成功,但是在网页显示时,第1次点添加能成功添加1个新的空编辑行。第2次再点添加时就出错了,在第一条记录的上面添加了条不可编辑的行,而把第一次成功添加的记录行变成了可编辑的状态。
各位高手帮看下是那里的错误啊?谢谢~!~!

解决方案 »

  1.   

    楼主的这种做法有点小问题,先在数据库添加记录再更新,
    如果确要添加是没问题的,但途中反悔不想添加了,你还要删除!!
    所以这不是一个好方法:常规的做法是在GridView中的FootRow中进行,
    设置GridView1.ShowFooter = true;
    在FootRow添加TextBox,Button控件!!
      

  2.   

    在GridView中的FootRow中做添加!!
      

  3.   

    原理:不在gridview上操作添加.在页面上其它地方添加新行存入数据库,再重新绑定gridview页面aspx:
    <body>
        <form id="form1" runat="server">
            <asp:GridView ID="GridView1" runat="server"></asp:GridView>
            <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="添加新行" />
            <div id="divAdd" style="display:none;">
            <asp:TextBox ID="txtFied1" runat="server"></asp:TextBox><asp:TextBox ID="txtFied2" runat="server"></asp:TextBox>
            </div>
        </form>
    </body>
    </html>
    <script language="javascript">
    //加这个效果是开始是隐藏了添加新行模块,点了按钮才出现输入,再点执行添加新
    function addnewrow()
    {
        if(document.getElementById('divAdd').style.display=='none')
        {
            document.getElementById('divAdd').style.display='';
            return false;
        }
    }
    document.getElementById('Button1').onclick=addnewrow;
    </script>CS代码:
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                BindGridView();//绑定gridview
            }
        }
        //绑定gridview
        private void BindGridView()
        {
            //...
        }
        protected void Button1_Click(object sender, EventArgs e)
        {
            //将字段值txtField1等值存入数据库(添加新)
            BindGridView();//重新绑定gridview
        }
      

  4.   

    上面只是单纯的添加新行功能
    如果你想的是多行编辑的话去baidu一下"gridview 多行编辑"应该可以找到点有用的东西,首先你的this.GridView1.EditIndex不要用,不要先插入数据。
    要用模版列TextBox,第一次绑定从数据库取,插入新空白行的话把gridview的数据源转化为datatable,在datatable中插入一新行,再绑定datatable
    如果你想部分显示的正常的字行,新插入空白行是textbox行,那模版列就要literal textbox一起用,然后在rowdatabound中确定显示哪个,是否新行建议在数据源上新增一列是否是新行来标识,或用viewstate来保存
      

  5.   

    给你个粗糙的版本..按自己想法再改页面aspx:
    <form id="form1" runat="server">
            <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" OnRowDataBound="GridView1_RowDataBound" OnRowCommand="GridView1_RowCommand">
                <Columns>
                    <asp:TemplateField HeaderText="AccountName">
                        <ItemTemplate>
                            <asp:Literal ID="litAccountName" runat="server"></asp:Literal>
                            <asp:TextBox ID="txtAccountName" runat="server" Visible="false"></asp:TextBox>
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:TemplateField HeaderText="Name">
                        <ItemTemplate>
                            <asp:Literal ID="litName" runat="server"></asp:Literal>
                            <asp:TextBox ID="txtName" runat="server" Visible="false"></asp:TextBox>
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:TemplateField HeaderText="编辑">
                        <ItemTemplate>
                            <asp:LinkButton ID="lbEdit" CommandName="EditRow" runat="server">编辑</asp:LinkButton>
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:TemplateField HeaderText="删除">
                        <ItemTemplate>
                            <asp:LinkButton ID="lbDelete" CommandName="DeleteRow" runat="server">删除</asp:LinkButton>
                        </ItemTemplate>
                    </asp:TemplateField>
                </Columns>
            </asp:GridView>
            <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="添加新行" />
        </form>代码CS:protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                BindGridView();
            }
        }    private void BindGridView(DataTable dt)
        {
            this.GridView1.DataSource = dt;
            this.GridView1.DataBind();
        }    //绑定gridview
        private void BindGridView()
        {
            DataTable dt = new DataTable();        //********begin为方便以下内容正常是从数据库取数据
            dt.Columns.Add("accountname");
            dt.Columns.Add("name");
            DataRow dr = dt.NewRow();
            dr["accountname"] = "111111111";
            dr["name"] = "111111name";
            dt.Rows.Add(dr); dr = dt.NewRow();
            dr["accountname"] = "22222";
            dr["name"] = "22222name";
            dt.Rows.Add(dr);
            //********end        //自定义标识列
            dt.Columns.Add("isnewrow");
            dt.Columns.Add("isupdaterow");
            this.ViewState.Add("gvdt", dt);
            BindGridView(dt);
            dt.Dispose();
        }    private void BindGridView2()
        {
            //从viewstate里取出绑定
            DataTable dt = (DataTable)this.ViewState["gvdt"];
            BindGridView(dt);
            dt.Dispose();
        }    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                Literal litAccountName = (Literal)e.Row.FindControl("litAccountName");
                TextBox txtAccountName = (TextBox)e.Row.FindControl("txtAccountName");
                litAccountName.Text = DataBinder.Eval(e.Row.DataItem, "accountname").ToString();
                txtAccountName.Text = litAccountName.Text;            Literal litName = (Literal)e.Row.FindControl("litName");
                TextBox txtName = (TextBox)e.Row.FindControl("txtName");
                litName.Text = DataBinder.Eval(e.Row.DataItem, "name").ToString();
                txtName.Text = litName.Text;            LinkButton lbEdit = (LinkButton)e.Row.FindControl("lbEdit");
                LinkButton lbDelete = (LinkButton)e.Row.FindControl("lbDelete");
                lbEdit.CommandArgument = e.Row.RowIndex.ToString();
                lbDelete.CommandArgument = e.Row.RowIndex.ToString();
                lbDelete.CommandName = "DeleteData";            string isnewrow = DataBinder.Eval(e.Row.DataItem, "isnewrow").ToString();
                string isupdaterow = DataBinder.Eval(e.Row.DataItem, "isupdaterow").ToString();            if (isnewrow == "1")//新行
                {
                    litAccountName.Visible = false;
                    txtAccountName.Visible = true;
                    litName.Visible = false;
                    txtName.Visible = true;
                    lbEdit.CommandName = "InsertData";
                    lbEdit.Text = "提交";
                    lbDelete.CommandName = "DeleteRow";
                }
                else if (isupdaterow == "1")//编辑行
                {
                    litAccountName.Visible = false;
                    txtAccountName.Visible = true;
                    litName.Visible = false;
                    txtName.Visible = true;
                    lbEdit.CommandName = "UpdateData";
                    lbEdit.Text = "提交";
                }
                else
                {
                    litAccountName.Visible = true;
                    txtAccountName.Visible = false;
                    litName.Visible = true;
                    txtName.Visible = false;
                    lbEdit.CommandName = "EditRow";
                    lbEdit.Text = "编辑";
                }
            }
        }
        protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            string eCName = e.CommandName;
            int rowindex = -1;
            if (eCName != "")
            {
                rowindex = Convert.ToInt32(e.CommandArgument);
            }
            //变为可编辑行
            if (eCName == "EditRow")
            {
                DataTable dt = (DataTable)this.ViewState["gvdt"];
                dt.Rows[rowindex]["isupdaterow"] = "1";
                this.ViewState["gvdt"] = dt;
                dt.Dispose();            BindGridView2();
            }
            //删除此行,不删除数据库
            if (eCName == "DeleteRow")
            {
                DataTable dt = (DataTable)this.ViewState["gvdt"];
                dt.Rows.RemoveAt(rowindex);
                this.ViewState["gvdt"] = dt;
                dt.Dispose();            BindGridView2();
            }
            //删除此行,删除数据库
            if (e.CommandName == "DeleteData")
            {
                DataTable dt = (DataTable)this.ViewState["gvdt"];
                //........从数据删除此rowindex行
                dt.Rows.RemoveAt(rowindex);
                this.ViewState["gvdt"] = dt;
                dt.Dispose();            BindGridView2();
            }
            //插入数据库,并更改为不可编辑行
            if (e.CommandName == "InsertData")
            {
                DataTable dt = (DataTable)this.ViewState["gvdt"];
                string accountname = ((TextBox)this.GridView1.Rows[rowindex].FindControl("txtAccountName")).Text;
                string name = ((TextBox)this.GridView1.Rows[rowindex].FindControl("txtName")).Text;
                //......将值插入数据库
                dt.Rows[rowindex]["isnewrow"] = "";
                dt.Rows[rowindex]["accountname"] = accountname;
                dt.Rows[rowindex]["name"] = name;
                this.ViewState["gvdt"] = dt;
                dt.Dispose();            BindGridView2();
            }
            //更新数据库,并更改为不可编辑行
            if (e.CommandName == "UpdateData")
            {
                DataTable dt = (DataTable)this.ViewState["gvdt"];
                string accountname = ((TextBox)this.GridView1.Rows[rowindex].FindControl("txtAccountName")).Text;
                string name = ((TextBox)this.GridView1.Rows[rowindex].FindControl("txtName")).Text;
                //......将值更新到数据库
                dt.Rows[rowindex]["isupdaterow"] = "";
                dt.Rows[rowindex]["accountname"] = accountname;
                dt.Rows[rowindex]["name"] = name;
                this.ViewState["gvdt"] = dt;
                dt.Dispose();            BindGridView2();
            }
        }
        protected void Button1_Click(object sender, EventArgs e)
        {
            DataTable dt = (DataTable)this.ViewState["gvdt"];
            DataRow dr = dt.NewRow();
            dr["isnewrow"] = "1";
            dt.Rows.Add(dr);
            this.ViewState["gvdt"] = dt;
            dt.Dispose();        BindGridView2();
        }