自定义分页的DataGrid中,如何取当前行中某行的值?

mfkjl 2005-06-06 02:51:28
通过e.Item.Cells[2].Text有2个问题:
1.取不到HyperLinkColumn、ButtonColumn的值,只能取BoundColumn的值。
2.分页时,如果不是第1页,取出来的是第一页的值。如当前是第二页(从11到20,11是本页的第一行),我选择11时,取出来的是第一页中第一行的值。

请大侠帮忙!
...全文
195 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
sukaru 2005-06-30
  • 打赏
  • 举报
回复
1、用e.Item.Cells[2].Controls[0]或e.Item.Cells[2].Controls[x]来获得对应的控件,然后再获得控件的对应属性

2、将绑定datagrid的代码写在Page_Load中的
if (!IsPostBack)
{
//里面
}
shuichangliu 2005-06-30
  • 打赏
  • 举报
回复
mark
mfkjl 2005-06-14
  • 打赏
  • 举报
回复
大家都搞不定?
mfkjl 2005-06-10
  • 打赏
  • 举报
回复
顶一下
mfkjl 2005-06-08
  • 打赏
  • 举报
回复
To fancyf(凡瑞) :
PageIndexChanged事件中执行了databind

我把代码贴出来:
private void Page_Load(object sender, System.EventArgs e)
{
controller=UserManageController.getInstance();
dg_users.VirtualItemCount = controller.getUserCount();
string pageNo=Request.QueryString["pageNo"];
if (pageNo==null)
{
pageNo="0";
}
if (!IsPostBack)
{
bindData(pageNo);
}
}
private void bindData(string pageNo)
{
int page=Int32.Parse(pageNo);
dg_users.CurrentPageIndex=page;
dstUsers = controller.getUsers();
DataView dv_users=dstUsers.Tables["users"].DefaultView;
dv_users.RowFilter="rownum >"+page*dg_users.PageSize+" and rownum<="+(page+1)*dg_users.PageSize;
dg_users.DataSource=dv_users;
dg_users.DataBind();
}

private void dg_users_PageIndexChanged(object source, System.Web.UI.WebControls.DataGridPageChangedEventArgs e)
{
bindData(e.NewPageIndex.ToString());
}

private void dg_users_DeleteCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
string userId=((HyperLink)e.Item.Cells[1].Controls[0]).Text;
Label1.Text=userId;//取到的是第一页的值
}
fanruinet 2005-06-08
  • 打赏
  • 举报
回复
在PageIndexChanged事件中执行databind了么?
seekg 2005-06-08
  • 打赏
  • 举报
回复
Page_Loads时加默认的数据(比如前十行)
mfkjl 2005-06-08
  • 打赏
  • 举报
回复
To fancyf(凡瑞) :
使用(!IsPostBack())后,点击其它页后,数据不显示

我感觉里面的关键是点击按钮后首先执行的是Page_Load,而不是按钮对应的代码,不知用什么方法能够解决这个问题?
我觉得“jisen(亲密爱人)”的思路是正确的

本人刚学Asp.Net,如有幼稚言语,请指出。
mfkjl 2005-06-08
  • 打赏
  • 举报
回复
To fancyf(凡瑞) :
((HyperLink)e.Item.Cells[2].Controls[0]).Text 可以使用
使用(!IsPostBack())后有问题,我先自己研究一下:)

To jisen(亲密爱人):
请问如何保存?

我调试了一下,我点击删除按钮时,最先执行的仍然是Page_Load,到执行Delete时,取出来的肯定是第一页的值。
goody9807 2005-06-08
  • 打赏
  • 举报
回复
5.1.1、DataGridItem的属性
ItemIndex —— 得到行在Items中的索引
ItemType —— 返回行的类型,也就是上面列出的Header、Item、...、Pager
Cells —— 返回行包含的所有TableCell(不管是显示声明的,还是自动生成的,不管是可以看见的,还是隐藏掉的),通过TableCell,可以读取Cell中显示的文本、包含的控件
严重注意:只有BoundColumn列和自动生成列,才可以通过TableCell.Text属性读取显示的文本。HyperLinkColumn、ButtonColumn、EditCommandColumn都需要将目标控件转换成相应的控件。
比如:
假设DataGrid的第一列声明如下
<asp:HyperLinkColumn DataTextField="au_id" HeaderText="au_id" DataNavigateUrlField="au_id" DataNavigateUrlFormatString="Edit.aspx?id={0}"></asp:HyperLinkColumn>
读取的时候可以用:
//Items[0]表示第一行,Cells[0]表示第一列,Controls[0]表示Cell中的第一个控件(也只有这个控件可以用)
HyperLink link = (HyperLink)DataGrid1.Items[0].Cells[0].Controls[0]);
Response.Write(link.Text);
至于模板列(TemplateColumn),当然也可以通过DataGrid1.Items[i].Cells[j].Controls[n]来获取,然后转换成原来的控件类型再操作,但是还有个更好的办法,就是用FindControl来查找控件。
FindControl是System.Web.UI.Control的方法,可以根据子控件ID来查找子控件
比如:
假设DataGrid的某一列声明如下
<asp:TemplateColumn>
<ItemTemplate>
<asp:TextBox Runat="server" ID="txtID" Text='<%# DataBinder.Eval(Container.DataItem,"au_id") %>'>
</asp:TextBox>
</ItemTemplate>
</asp:TemplateColumn>
读取方法:
TextBox txt = (TextBox)DataGrid1.Items[1].FindControl("txtID");
Response.Write(txt.Text);
注意:DataList中是没有Cell的
jisen 2005-06-08
  • 打赏
  • 举报
回复
在你选择某列值时候,一定要在下次作Page_load()把得到的值保存下来,否则,就出现你的那种现象了!
soft_biao 2005-06-08
  • 打赏
  • 举报
回复
我也遇到过类似的情况
帮你顶一个
fanruinet 2005-06-08
  • 打赏
  • 举报
回复
分页的问题前面我说了,你把databind放在
将绑定datagrid的代码写在Page_Load中的
if (!IsPostBack)
{
//里面
}
了吗?
fanruinet 2005-06-08
  • 打赏
  • 举报
回复
e.Item.Cells[2].Controls[0].Text
没转换类型

应该
((HyperLink)e.Item.Cells[2].Controls[0]).Text
也可能是
((HyperLink)e.Item.Cells[2].Controls[1]).Text
试一试吧
mfkjl 2005-06-08
  • 打赏
  • 举报
回复
我的分页是这样实现的:
在Page_Load中,检索数据放到DataSet中,缓存到Cache
在DataGrid的PageIndexChanged中,用DataSet进行过滤,显示到DataGrid中。

这样做后,目前显示一切正常,点击分页能正常显示数据。
目前的问题就是无法取非第一页的某行的值,如我点击第二页的第一行数据,得到的值是第一页的第一行的数据。
另外,还有一个问题:每行我都设了一个ButtonColumn用于删除本行数据,但点击删除后,总是会返回到第一页。如我点击第三页的某行的删除,页面会自动跳回第一页。

大侠帮忙!
zeusvenus 2005-06-08
  • 打赏
  • 举报
回复
用e传索引值
mfkjl 2005-06-08
  • 打赏
  • 举报
回复
我用的语言是C#,写 e.Item.Cells[2].Controls[0].Text 编译出错
liuqinglq 2005-06-06
  • 打赏
  • 举报
回复
HyperLinkColumn、ButtonColumn 的话

用 e.Item.Cells[2].Controls[0].Text

或者 e.Item.Cells[2].FindControl("这里填Button的ID").Text
baobei7758 2005-06-06
  • 打赏
  • 举报
回复
如何得到DataGrid中点击的当前行数据
http://dotnet.aspx.cc/ShowDetail.aspx?id=19BE9FAC-437A-4863-910D-9427554561B2
fanruinet 2005-06-06
  • 打赏
  • 举报
回复
1、用e.Item.Cells[2].Controls[0]或e.Item.Cells[2].Controls[x]来获得对应的控件,然后再获得控件的对应属性

2、将绑定datagrid的代码写在Page_Load中的
if (!IsPostBack)
{
//里面
}

62,040

社区成员

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

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

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

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