asp.net 动态生成Table控件如何获取每一个单元格的值

Csharp初学者 2013-04-29 12:09:04
我能够动态的生成Table,并将数据显示在上面,可是获取值的时候只能获取到标题行。敢问要怎么才能获取的每一个格子里面的数据。
代码如下:
aspx:
<asp:Button ID="btn_in" runat="server" Text="为选中商品批量进货"
onclick="Button2_Click" />
<asp:Table ID="datatable1" runat="server" BackColor="White" BorderColor="#CC9966"
BorderStyle="None" BorderWidth="1px" Width="100%" >
<asp:TableHeaderRow BackColor="#990000" Font-Bold="True" ForeColor="#FFFFCC" >
<asp:TableHeaderCell>
选则
</asp:TableHeaderCell>
<asp:TableHeaderCell>
编号
</asp:TableHeaderCell>
<asp:TableHeaderCell>
商品名称
</asp:TableHeaderCell>
<asp:TableHeaderCell>
商品编号
</asp:TableHeaderCell>
<asp:TableHeaderCell>
商品分类
</asp:TableHeaderCell>
<asp:TableHeaderCell>
规格
</asp:TableHeaderCell>
<asp:TableHeaderCell>
单位
</asp:TableHeaderCell>
<asp:TableHeaderCell>
库存
</asp:TableHeaderCell>
<asp:TableHeaderCell>
仓库
</asp:TableHeaderCell>
<asp:TableHeaderCell>
供应商
</asp:TableHeaderCell>
</asp:TableHeaderRow>
</asp:Table>
aspx.cs:
private static string sql = "";
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
sql = "SELECT Goods.Gid, Goods.Gname, Goods.GNO, GoodsCategory.GCName, Goods.Gformat, Goods.GUnit, Goods.GInventory, Goods.Gware, WareHouse.name, Supplier.Sname FROM WareHouse INNER JOIN Goods ON WareHouse.id = Goods.Gware INNER JOIN Supplier ON Goods.Gproduce = Supplier.Sid INNER JOIN GoodsCategory ON Goods.GCateGary = GoodsCategory.GCid";
DataBindTable(sql);

}
}
private void DataBindTable(string sql)
{
DataTable dt = new DataTable();
BaseClass bs = new BaseClass();
dt = bs.readData(sql);
for (int i = 1; i < datatable1.Rows.Count; i++)
{
datatable1.Rows[i].Cells.Clear();
}
if (dt.Rows.Count > 0)
{


for (int i = 0; i < dt.Rows.Count; i++)
{
TableRow row = new TableRow();

TableCell[] cells = new TableCell[10];
for (int mm = 0; mm < 10; mm++)
{
cells[mm] = new TableCell();
}
CheckBox CHB = new CheckBox();
CHB.ID = "CHB";
cells[0].Controls.Add(CHB);
cells[1].Text = dt.Rows[i]["Gid"].ToString();
cells[2].Text = dt.Rows[i]["Gname"].ToString();
cells[3].Text = dt.Rows[i]["GNO"].ToString();
cells[4].Text = dt.Rows[i]["GCName"].ToString();
cells[5].Text = dt.Rows[i]["Gformat"].ToString();
cells[6].Text = dt.Rows[i]["GUnit"].ToString();
cells[7].Text = dt.Rows[i]["GInventory"].ToString();
cells[8].Text = dt.Rows[i]["name"].ToString();
cells[9].Text = dt.Rows[i]["Sname"].ToString();


for (int j = 0; j < cells.Length; j++)
{
row.Cells.Add(cells[j]);
}
datatable1.Rows.Add(row);
}
}
}
protected void Button2_Click(object sender, EventArgs e)
{
if (BaseClass.getIntFormatData(txt_num.Text) == true)
{
Response.Write(datatable1.Rows.Count);
#region 进货
BaseClass bs = new BaseClass();
UserInfo user = (UserInfo)Session["user"];
bool flag = true;
foreach (TableRow item in datatable1.Rows)
{
CheckBox check = (CheckBox)item.FindControl("CHB");
if (check != null && check.Checked == true)
{
string sql = "update goods set ginventory=" + (int.Parse(item.Cells[7].Text) + int.Parse(txt_num.Text)) + " where gid= " + int.Parse(item.Cells[1].Text);
string sql2 = "insert into riaddGoods(rigid,rinum,ritime,ricomment,riname,rimark)values(" + int.Parse(item.Cells[1].Text) + "," + int.Parse(txt_num.Text)
+ ",'" + DateTime.Now.ToString("yyyy-MM-dd") + "','" + txt_comment.Text + "','" + user.workid + "','" + "购买入库" + "')";

try
{
bs.execSql(sql);
bs.execSql(sql2);
}
catch
{
flag = false;
}
}
}
if (flag == false)
{
Response.Write(Message.MessageBox("进货有失败信息,请联系管理员"));
}
else
{
Response.Write(Message.MessageBox("进货成功!"));
}
#endregion
}
else
{
Response.Write(Message.MessageBox("请输入合理的数据后在进行操作!"));

}
}

我已经测试输出,这个行只有标题行,可是从数据库读出来的数据显示在表格里面的数据,却不能获取到。
...全文
1907 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
贾谷瑶 2015-08-04
  • 打赏
  • 举报
回复
楼上这位大哥出没在各个贴子中,我也是醉了
wwwhhb4003 2013-05-04
  • 打赏
  • 举报
回复
虽然不懂,还是要标记一下
  • 打赏
  • 举报
回复
当一个页面它初始化时产生了10行TableRow,如果用户在界面上选择两行的CheckBox,然后按“删除”按钮,那么你在Page_Load上会产生什么乱子呢? 正常的流程,是Page_Load中应该重建这10行TableRow,于是asp.net就可以将所有TableRow内部的数据——不管是CheckBox的还是TableCell的——都回填,然后asp.net就会触发这两个CheckBox上的Checkedchanged事件,然后触发这个按钮的Click事件。你在这个click事件中通过遍历各行的CheckBox来知道哪两行删除掉,于是形成sql语句发送给关系数据库。等数据库删除完,你这时候重新读取数据库绑定界面。 我告诉你,当你在click中重新绑定时,界面上不一定会显示8条记录。它完全可能显示5条记录,或者12条记录。因为一个asp.net程序在实际使用经验中,它是多用户并发访问的,在你删除这两条记录之前可能(多个)别人的会话也删除了3条记录或者添加了4条记录。 因此在回来看那个Page_Load中程序应该干什么?!它应该是恢复上一次输出html时的状态,也就是应该创建10行的控件,而不是去什么读取数据库然后创建7行或者14行控件。 在回发时,根本不应该在page_load中根本不应该读取数据库(也就不是用数据库数据来重新绑定控件)。切记。你在个人的电脑上一个人调试,特别是不动脑子去想出特别的测试用力,也许一时发现不了问题,于是不知道正常的page_load编程道理。
  • 打赏
  • 举报
回复
引用 4 楼 ymg_daolang 的回复:
楼上高见,问题已成功解决。
那是因为你在自己的电脑上单机一个人测试,没有实际经过检验,你不知道乱子出在哪里、有多严重。
  • 打赏
  • 举报
回复
尽量使用DataList,而不是自己去new TableCell。 如果自己new,那么你要做的事情就很多了。 如果动态new,那么回发时在你的Page_Load中去调用DataBindTable(sql)显然是错误的(可惜,许多人非常粗心所以确不知道这种区别)。在回发时,它不是从数据库中去查询出绑定数据,而是要从ViewState中读取上一次输出html时所保存起来的行数,然后重建TableCell。注意,并不为cells[...].Text赋值,因为你根本不知道该赋什么值,asp.net会自动将上一次输出html时缓存起来的ViewState["Text"]值回填。你去给Text赋值纯粹是画蛇添足的,赋值之后最终在Page_load执行完毕之后你去读取Text也不一定会独取出来是这个值。 总之,一方面你可能找不到“动态创建控件”的编程教程,另一方面你找到的教程可能大多数都是向“重新绑定数据库数据”这种根本是错误的教学,所以你最好还是多用DataList等控件,先不要动态创建控件!
Csharp初学者 2013-05-01
  • 打赏
  • 举报
回复
楼上高见,问题已成功解决。
junlin15823443861 2013-04-29
  • 打赏
  • 举报
回复
给你一个我曾经用GridView取到值得代码,能不能参考自己看吧。 我的值是绑定到页面的 for (int i = 0; i < this.GridView1.Rows.Count; i++) { GridViewRow row = GridView1.Rows[i]; string name = row.Cells[0].Text; string eg = ((DropDownList)row.Cells[4].FindControl("DropDownList1")).Text; }
梦在旅途 2013-04-29
  • 打赏
  • 举报
回复
很简单,因为TABLE控件在你点击按钮,触发事件后传回服务器时,原来已动态加载的数据会全部丢失,即TABLE动态添加的行会变成默认状态, TABLE控件是不支持AUTOPOSKBACK的,只有支持POSTBACK的控件才能保存值,因为值是存在VIEWSTATE中的,比如GridView,DATALIST等数据控件都可以的! 所以凡是涉及数据更新操作,一般都采用数据控件,当然你若非要使用TABLE控件,则可以在PAGE_LOAD事件中调用你的DataBindTable方法,当然不要限定IsPostBack,否则仍无法取得值的 希望能帮到你!
Csharp初学者 2013-04-29
  • 打赏
  • 举报
回复
我用GridView1也能取得值,但是Table为什么就不能取得值呢?这是一个奇怪的现象

62,272

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧