积极答复者
关于带模板列的GridView增删行及刷新问题

问题
答案
-
那你直接改用table操作就行了。
参考下面代码试试。
<%@ Page Language="C#" %> <%@ Import Namespace="System" %> <%@ Import Namespace="System.Configuration" %> <%@ Import Namespace="System.Data" %> <%@ Import Namespace="System.Linq" %> <%@ Import Namespace="System.Web" %> <%@ Import Namespace="System.Web.Security" %> <%@ Import Namespace="System.Web.UI" %> <%@ Import Namespace="System.Web.UI.HtmlControls" %> <%@ Import Namespace="System.Web.UI.WebControls" %> <%@ Import Namespace="System.Web.UI.WebControls.WebParts" %> <%@ Import Namespace="System.Web.Services" %> <%@ Import Namespace="System.ComponentModel" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <script runat="server"> public DataTable GenerateDT { get { if (ViewState["ds"] != null) { return (ViewState["ds"] as DataSet).Tables[0]; } else { DataTable dt = new DataTable(); dt.Columns.Add("Id", typeof(int)); dt.Columns.Add("Test1", typeof(string)); dt.Columns.Add("Test2", typeof(string)); dt.Columns.Add("Test3", typeof(string)); dt.Columns.Add("UserName", typeof(string)); dt.Columns.Add("Password", typeof(string)); dt.Columns.Add("Bool", typeof(System.Boolean)); dt.PrimaryKey = new DataColumn[] { dt.Columns[0] }; DataRow dr1 = dt.NewRow(); dr1[0] = "1"; dr1[1] = "red"; dr1[2] = "test3"; dr1[3] = "test3"; dr1[4] = "Name1"; dr1[5] = ""; dr1[6] = true; dt.Rows.Add(dr1); DataRow dr2 = dt.NewRow(); dr2[0] = "2"; dr2[1] = "blue"; dr2[2] = "test3"; dr2[3] = "test3"; dr2[4] = "Name2"; dr2[5] = "2"; dr2[6] = true; dt.Rows.Add(dr2); DataRow dr3 = dt.NewRow(); dr3[0] = "3"; dr3[1] = "yellow"; dr3[2] = "test3"; dr3[3] = "test3"; dr3[4] = "Name2"; dr3[5] = ""; dr3[6] = true; dt.Rows.Add(dr3); DataSet ds = new DataSet(); ds.Tables.Add(dt); ViewState["ds"] = ds; return dt; } } set { ViewState["ds"] = value; } } </script> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> <script src="../Scripts/jquery-1.3.2.min.js" type="text/javascript"></script> </head> <body> <form id="form1" runat="server"> <div> <table cellspacing="0" border="1" id="table1" style="border-collapse:collapse;"> <thead> <tr> <th scope="col"> </th><th scope="col">Id</th><th scope="col">Test1</th><th scope="col">Test2</th><th scope="col">Test3</th><th scope="col">UserName</th><th scope="col">Password</th> </tr> </thead> <tbody id="testBody"> <%int rows =0; string indexCollection =","; %> <% foreach (DataRow item in GenerateDT.Rows) { indexCollection += rows.ToString()+",";%> <tr id='<%="tr"+rows.ToString() %>'> <td><input type="button" onclick="addRow(<%=rows %>)" value="Add Row" id="<%="row"+rows.ToString()+"Button0" %>"/><input type="button" onclick="deleteRow(<%=rows %>)" value="Delete Row" id="<%="row"+rows.ToString()+"Button1" %>"/></td> <td><input id="<%="row"+rows.ToString()+"Text0" %>" type="text" value='<%=item[0] %>'/></td> <td><input id="<%="row"+rows.ToString()+"Text1" %>" type="text" value='<%=item[1] %>'/></td> <td><input id="<%="row"+rows.ToString()+"Text2" %>" type="text" value='<%=item[2] %>'/></td> <td><input id="<%="row"+rows.ToString()+"Text3" %>" type="text" value='<%=item[3] %>'/></td> <td><input id="<%="row"+rows.ToString()+"Text4" %>" type="text" value='<%=item[4] %>'/></td> <td><input id="<%="row"+rows.ToString()+"Text5" %>" type="text" value='<%=item[5] %>'/></td> </tr> <% rows++; } %> </tbody> </table> <input id="Hidden1" type="hidden" /> <script type="text/javascript" language="javascript"> var indexCollection=<%="\""+indexCollection.ToString()+"\"" %>; setHiddenField(); var rows=<%=rows %>; function addRow(index) { rows=rows+1; var newTr="<tr id=\"tr"+rows+"\"><td><input type=\"button\" onclick=\"addRow('"+rows+"')\""+" value=\"Add Row\" id=\""+"row"+rows+"Button0"+"\"/>" +"<input type=\"button\" onclick=\"deleteRow('"+rows+"')\""+" value=\"Delete Row\" id=\""+"row"+rows+"Button1"+"\"/>" +"<td><input id=\""+"row"+rows+"Text0"+"\" type=\"text\"/></td>" +"<td><input id=\""+"row"+rows+"Text1"+"\" type=\"text\"/></td>" +"<td><input id=\""+"row"+rows+"Text2"+"\" type=\"text\"/></td>" +"<td><input id=\""+"row"+rows+"Text3"+"\" type=\"text\"/></td>" +"<td><input id=\""+"row"+rows+"Text4"+"\" type=\"text\"/></td>" +"<td><input id=\""+"row"+rows+"Text5"+"\" type=\"text\"/></td></tr>"; indexCollection=indexCollection+rows+","; $("#testBody").html($("#testBody").html()+newTr); setHiddenField(); } function deleteRow(index) { var reg=new RegExp("\\,"+index+"\\,"); indexCollection=indexCollection.replace(reg,","); var row=document.getElementById("tr"+index); document.getElementById("table1").deleteRow(row.rowIndex); setHiddenField(); } function setHiddenField() { document.getElementById("Hidden1").value=indexCollection.toString(); } </script> </div> </form> </body> </html>
Microsoft Online Community Support- 已标记为答案 KeFang Chen 2009年12月3日 5:36
全部回复
-
那你直接改用table操作就行了。
参考下面代码试试。
<%@ Page Language="C#" %> <%@ Import Namespace="System" %> <%@ Import Namespace="System.Configuration" %> <%@ Import Namespace="System.Data" %> <%@ Import Namespace="System.Linq" %> <%@ Import Namespace="System.Web" %> <%@ Import Namespace="System.Web.Security" %> <%@ Import Namespace="System.Web.UI" %> <%@ Import Namespace="System.Web.UI.HtmlControls" %> <%@ Import Namespace="System.Web.UI.WebControls" %> <%@ Import Namespace="System.Web.UI.WebControls.WebParts" %> <%@ Import Namespace="System.Web.Services" %> <%@ Import Namespace="System.ComponentModel" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <script runat="server"> public DataTable GenerateDT { get { if (ViewState["ds"] != null) { return (ViewState["ds"] as DataSet).Tables[0]; } else { DataTable dt = new DataTable(); dt.Columns.Add("Id", typeof(int)); dt.Columns.Add("Test1", typeof(string)); dt.Columns.Add("Test2", typeof(string)); dt.Columns.Add("Test3", typeof(string)); dt.Columns.Add("UserName", typeof(string)); dt.Columns.Add("Password", typeof(string)); dt.Columns.Add("Bool", typeof(System.Boolean)); dt.PrimaryKey = new DataColumn[] { dt.Columns[0] }; DataRow dr1 = dt.NewRow(); dr1[0] = "1"; dr1[1] = "red"; dr1[2] = "test3"; dr1[3] = "test3"; dr1[4] = "Name1"; dr1[5] = ""; dr1[6] = true; dt.Rows.Add(dr1); DataRow dr2 = dt.NewRow(); dr2[0] = "2"; dr2[1] = "blue"; dr2[2] = "test3"; dr2[3] = "test3"; dr2[4] = "Name2"; dr2[5] = "2"; dr2[6] = true; dt.Rows.Add(dr2); DataRow dr3 = dt.NewRow(); dr3[0] = "3"; dr3[1] = "yellow"; dr3[2] = "test3"; dr3[3] = "test3"; dr3[4] = "Name2"; dr3[5] = ""; dr3[6] = true; dt.Rows.Add(dr3); DataSet ds = new DataSet(); ds.Tables.Add(dt); ViewState["ds"] = ds; return dt; } } set { ViewState["ds"] = value; } } </script> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> <script src="../Scripts/jquery-1.3.2.min.js" type="text/javascript"></script> </head> <body> <form id="form1" runat="server"> <div> <table cellspacing="0" border="1" id="table1" style="border-collapse:collapse;"> <thead> <tr> <th scope="col"> </th><th scope="col">Id</th><th scope="col">Test1</th><th scope="col">Test2</th><th scope="col">Test3</th><th scope="col">UserName</th><th scope="col">Password</th> </tr> </thead> <tbody id="testBody"> <%int rows =0; string indexCollection =","; %> <% foreach (DataRow item in GenerateDT.Rows) { indexCollection += rows.ToString()+",";%> <tr id='<%="tr"+rows.ToString() %>'> <td><input type="button" onclick="addRow(<%=rows %>)" value="Add Row" id="<%="row"+rows.ToString()+"Button0" %>"/><input type="button" onclick="deleteRow(<%=rows %>)" value="Delete Row" id="<%="row"+rows.ToString()+"Button1" %>"/></td> <td><input id="<%="row"+rows.ToString()+"Text0" %>" type="text" value='<%=item[0] %>'/></td> <td><input id="<%="row"+rows.ToString()+"Text1" %>" type="text" value='<%=item[1] %>'/></td> <td><input id="<%="row"+rows.ToString()+"Text2" %>" type="text" value='<%=item[2] %>'/></td> <td><input id="<%="row"+rows.ToString()+"Text3" %>" type="text" value='<%=item[3] %>'/></td> <td><input id="<%="row"+rows.ToString()+"Text4" %>" type="text" value='<%=item[4] %>'/></td> <td><input id="<%="row"+rows.ToString()+"Text5" %>" type="text" value='<%=item[5] %>'/></td> </tr> <% rows++; } %> </tbody> </table> <input id="Hidden1" type="hidden" /> <script type="text/javascript" language="javascript"> var indexCollection=<%="\""+indexCollection.ToString()+"\"" %>; setHiddenField(); var rows=<%=rows %>; function addRow(index) { rows=rows+1; var newTr="<tr id=\"tr"+rows+"\"><td><input type=\"button\" onclick=\"addRow('"+rows+"')\""+" value=\"Add Row\" id=\""+"row"+rows+"Button0"+"\"/>" +"<input type=\"button\" onclick=\"deleteRow('"+rows+"')\""+" value=\"Delete Row\" id=\""+"row"+rows+"Button1"+"\"/>" +"<td><input id=\""+"row"+rows+"Text0"+"\" type=\"text\"/></td>" +"<td><input id=\""+"row"+rows+"Text1"+"\" type=\"text\"/></td>" +"<td><input id=\""+"row"+rows+"Text2"+"\" type=\"text\"/></td>" +"<td><input id=\""+"row"+rows+"Text3"+"\" type=\"text\"/></td>" +"<td><input id=\""+"row"+rows+"Text4"+"\" type=\"text\"/></td>" +"<td><input id=\""+"row"+rows+"Text5"+"\" type=\"text\"/></td></tr>"; indexCollection=indexCollection+rows+","; $("#testBody").html($("#testBody").html()+newTr); setHiddenField(); } function deleteRow(index) { var reg=new RegExp("\\,"+index+"\\,"); indexCollection=indexCollection.replace(reg,","); var row=document.getElementById("tr"+index); document.getElementById("table1").deleteRow(row.rowIndex); setHiddenField(); } function setHiddenField() { document.getElementById("Hidden1").value=indexCollection.toString(); } </script> </div> </form> </body> </html>
Microsoft Online Community Support- 已标记为答案 KeFang Chen 2009年12月3日 5:36
-
indexCollection 是用来访问行以及每行的text等。
比如说indexCollection=“,1,2,4,9,”;
那对应的tr的id就是"tr1","tr2"等。
每行对应的textbox的id:
row0Text0,row0Text1,row0Text2,row0Text3,row0Text4,row0Text5,
row1Text0,row1Text1,row1Text2,row1Text3,row1Text4,row1Text5,
.............................................................................................
也就是方便你在后台用Request.Form来获取控件值的。
Microsoft Online Community Support -
请注意我的代码开头引入了一个jquery的脚本文件。
如果你没有用过,你可以到下面这个地址下载,然后直接拽到你的页面上。
http://jqueryjs.googlecode.com/files/jquery-1.3.2.min.js
Microsoft Online Community Support -
我这儿GridView在源码页是这样的
<asp:GridView ID="GridView2" runat="server" AutoGenerateColumns="False"
Height ="90%"
onrowdatabound="gv2_bound">
<Columns>
<asp:BoundField DataField="code" HeaderText="code" HtmlEncode="False" />
<asp:TemplateField HeaderText="ename">
<ItemTemplate>
<asp:TextBox ID="TextBox3" runat="server" Text='<%# Bind("ename") %>'
BorderStyle="None" ontextchanged="TextBox3_TextChanged" ></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="sname" >
<ItemTemplate>
<asp:TextBox ID="TextBox4" runat="server" Text='<%# Bind("sname") %>'
BorderStyle="None" ></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
写 var newTr 那段该怎么写? -
以当前客户端的表格为准?
意思是说根据当前表格的情况保存相应的信息对吧。
我那个hiddenfield里面保存的字符串就是用来解决这个问题的啊。
你首先在后台获得里面的数据,然后调用stirng.split方法获得一个数组。
然后跟我上面给你说的的规则,遍历调用Request.Form["textbox name"]来得到值。
上面代码中每个textbox,你得给它赋个name属性,怎么给它name赋值可以参考id是怎么赋值的。如果没有name属性,后台用request.form无法获得的。
Microsoft Online Community Support