通过按钮向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次再点添加时就出错了,在第一条记录的上面添加了条不可编辑的行,而把第一次成功添加的记录行变成了可编辑的状态。
各位高手帮看下是那里的错误啊?谢谢~!~!
解决方案 »
- 拖拽直接运行功能
- 最后一百分了!请大家帮帮我看看。
- 如何给PDF文件加文字水印?
- 如何得到一个窗体的大小(除去边框和菜单)
- 请问:微软的树控件的webctrl_client文件夹,是否必须放在虚拟目录的根目录下(默认:C:/interpub/wwwroot下)呢?有人说:
- .Net高手请入
- 非常着急的问一个问题 在aspx中如何取得当前的session?????
- 数据库是字符型日期,如何查询两日期中间的数据?
- 谁有?利用XML实现通用WEB报表打印(源代码)
- win form中的DataGrid 有字段是bool型的,怎么取出它的值?
- C#如何得到每个进程的路径,请高人给个真正可以实现的方法!
- 分辨率调整问题?
如果确要添加是没问题的,但途中反悔不想添加了,你还要删除!!
所以这不是一个好方法:常规的做法是在GridView中的FootRow中进行,
设置GridView1.ShowFooter = true;
在FootRow添加TextBox,Button控件!!
<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
}
如果你想的是多行编辑的话去baidu一下"gridview 多行编辑"应该可以找到点有用的东西,首先你的this.GridView1.EditIndex不要用,不要先插入数据。
要用模版列TextBox,第一次绑定从数据库取,插入新空白行的话把gridview的数据源转化为datatable,在datatable中插入一新行,再绑定datatable
如果你想部分显示的正常的字行,新插入空白行是textbox行,那模版列就要literal textbox一起用,然后在rowdatabound中确定显示哪个,是否新行建议在数据源上新增一列是否是新行来标识,或用viewstate来保存
<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();
}