GridView1获取模板列很诡异的异常,高手都来帮我看看...。。。。。。愁~

pgameli 2008-12-29 11:24:49
GridView1第五列有一个状态模板列,里面放了一个LinkButton,LinkButton的文本是绑定上去的,只显示“是”或“否“,id="zhuangtai"
绑定数据的时候一切正常,LinkButton文本都是正常显示
我想在点击这个LinkButton的时候获取LinkButton的文本值
我在GridView1的RowCommand事件里面这样写的:
LinkButton lb = (LinkButton)GridView1.SelectedRow.Cells[4].FindControl("zhuangtai");
string str=lb.Text;
可是点 LinkButton 的时候就报异常,未将对象引用到实例

各位给我帮忙看看
到底是哪里错了
我找了两天也没找到
...全文
294 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
pgameli 2008-12-29
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 koukoujiayi 的回复:]
但是有个问题
比如LinkButton 的文本值是"否"
输出的时候却是”否否“
这是为什么
=======================
换个英文看看!!在确定是什么问题!!
[/Quote]
好了
问题解决了
谢谢各位了
koukoujiayi 2008-12-29
  • 打赏
  • 举报
回复
但是有个问题
比如LinkButton 的文本值是"否"
输出的时候却是”否否“
这是为什么
=======================
换个英文看看!!在确定是什么问题!!
pgameli 2008-12-29
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 koukoujiayi 的回复:]
楼主的做法没问题:
只要将LinkButton1的CommandName属性设置为Select!!
在GridView的SelectedIndexChanged事件中获取!!
protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
{
LinkButton lb = (LinkButton)GridView1.SelectedRow.Cells[4].FindControl("zhuangtai");
string str=lb.Text;
}
[/Quote]
恩,这个方法可以了
但是有个问题
比如LinkButton 的文本值是"否"
输出的时候却是”否否“
这是为什么
pgameli 2008-12-29
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 sp1234 的回复:]
不论你在模板列里边放置LinkButton还是别的什么,你都可以使用LinkButton自身的事件来捕获它自己,

(LinkButton)sender

就是它自己。使用GridView的事件再去FindControl是很麻烦的。除非你设计时的需求就被曲折地描述为GridView的某些逻辑部分,而如果是“我想在点击这个LinkButton的时候获取LinkButton的文本值 ”之类的需求,那么就直截了当地这样针对LinkButton编程,不要再去考虑这个LinkButton是放在GridView还是什么…
[/Quote]
我获取完文本值之后还有根据绑定编号来更改状态的业务逻辑

直接用linkbutton的事件实现不了
koukoujiayi 2008-12-29
  • 打赏
  • 举报
回复
楼主的做法没问题:
只要将LinkButton1的CommandName属性设置为Select!!
在GridView的SelectedIndexChanged事件中获取!!
protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
{
LinkButton lb = (LinkButton)GridView1.SelectedRow.Cells[4].FindControl("zhuangtai");
string str=lb.Text;
}
  • 打赏
  • 举报
回复
不论你在模板列里边放置LinkButton还是别的什么 --> 不论你将LinkButton放在任何一种容器的任意一个模板中

你此时此地编写的代码,因为你的需求描述与它的容器无关,于是你就不要去在实现时牵扯GridView这样的东西,这样的代码将是清晰和用的更长久的。
wuyq11 2008-12-29
  • 打赏
  • 举报
回复
LinkButton btn = sender as LinkButton;
GridViewRow row = btn.Parent.Parent as GridViewRow;
string str = row.Cells[0].Text;
  • 打赏
  • 举报
回复
不论你在模板列里边放置LinkButton还是别的什么,你都可以使用LinkButton自身的事件来捕获它自己,

(LinkButton)sender

就是它自己。使用GridView的事件再去FindControl是很麻烦的。除非你设计时的需求就被曲折地描述为GridView的某些逻辑部分,而如果是“我想在点击这个LinkButton的时候获取LinkButton的文本值 ”之类的需求,那么就直截了当地这样针对LinkButton编程,不要再去考虑这个LinkButton是放在GridView还是什么别的类型的容器中(你写出的程序跟GridView没有任何关系)。

除了使用

LinkButton lnk=(LinkButton)sender;

从而就可以检索这个LinkButton自身所有属性,你可以从它开始来检索它的“兄弟”控件,例如在同一模板列或者其它模板列中有一个Label1,你就可以检索:

Label lbl=(Label)lnk.FindControl("Label1");

这就可以得到运行时同一行中另一列的控件。
koukoujiayi 2008-12-29
  • 打赏
  • 举报
回复
楼主的做法没问题:
只要将LinkButton1的CommandName属性设置为Select就可以了!!
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 pgameli 的回复:]
不行,模板列里面的linkbutton没有事件
[/Quote]

首先,你要在设计窗口上选择GridView右键菜单的“编辑模板”,真正以所见即所得的方式打开了模板看到了linkbutton,这时候你就可以关联到属性窗口上的事件窗口。

初次以外,实际上直接编辑设计代码也是一样的。我就很少好似用属性窗口,而是直接写代码。当然,初学者应该更多使用ide。
pgameli 2008-12-29
  • 打赏
  • 举报
回复
我只是想获取linkbutton的文本
protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
zhuangtai_Command(sender, e);
}

protected void zhuangtai_Command(object sender, CommandEventArgs e)
{
LinkButton lb = (LinkButton)GridView1.SelectedRow.Cells[4].FindControl("zhuangtai");//e参数获取不到当前列,只能这样写了
Response.Write(lb.Text.ToString());
}
这样写还是不行
还是报那个异常
周公 2008-12-29
  • 打赏
  • 举报
回复
用ItemTemplate来做。
xtra6714 2008-12-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zhoufoxcn 的回复:]
只用用LinkButton的Command事件吧,省却了很多麻烦,OnCommand与OnClick不一样,OnCommand可以传递参数,而OnClick不能。
[/Quote]
同意,高手回复果然不太一样
周公 2008-12-29
  • 打赏
  • 举报
回复
asp.net夜话之六:asp.net基本控件
asp.net服务器控件是微软为了方便开发者开发而推出的一系列控件,它们都以类似的方式出现在Visual Studio 2005的源视图里,*代表了控件名,如就表示这是一个Button控件。asp.net服务器控件除了提供HTML服务器控件所能提供的功能之外,还有很多功能更为复杂的控件。这些控件可以分为简单控件、容器控件、数据绑定控件、数据源控件和数据验证控及用户自己根据自己业务需要将一些控件组合在一起组成的用户控件等。asp.net控件的特点与HTML服务器控件类似,也有如下特点:(1)asp.net服务器控件必须有一个在当前页面中唯一的ID属性和runat=”server”属性;(2)asp.net服务器控件必须放在服务器端表单中;(3)asp.net服务器控件最终会被解释成普通HTML标记发送到客户端浏览器。本文主要介绍以下控件:Button控件TextBox控件Web服务器控件的特殊客户端事件FileUpload控件Literal控件Panel控件PlaceHolder控件
pgameli 2008-12-29
  • 打赏
  • 举报
回复
不行,模板列里面的linkbutton没有事件
周公 2008-12-29
  • 打赏
  • 举报
回复

<asp:Button ID="btnCommand" runat="server" 
Text="Command" OnCommand="btnCommand_Command" CommandArgument="1" CssClass="redfoxcn" />


protected void btnCommand_Command(object sender, CommandEventArgs e)
{
Response.Write("发生了Command事件,事件的数据是:" + e.CommandArgument.ToString());
}

可以把需要传递的参数作为CommandArgument属性传递。
pgameli 2008-12-29
  • 打赏
  • 举报
回复
恩,那我先试试
周公 2008-12-29
  • 打赏
  • 举报
回复
Click和Command事件都是单击Button按钮时发生的事件,可是处理它们的委托类型不同,激发Click事件由 EventHandler委托来处理,激发Command事件后由CommandEventHandler委托来处理,看看它们的声明:

public delegate void EventHandler ( 
Object sender,
EventArgs e
)

public delegate void CommandEventHandler (
Object sender,
CommandEventArgs e
)

看出区别来了吗?它们都有两个参数,第一个参数表示由哪个控件激发了事件,第二个参数表示发生事件时的一些事件数据。这两个委托第一个参数都是相同的,第二个参数不同,EventArgs这个类不带有任何事件数据(这个委托很常见,不关心事件数据的事件都是用这个委托处理),而CommandEventArgs可以附带事件数据,它有两个重要属性:CommandArgument和CommandName。CommandArgument属性可以附带一些参数信息,CommandName用于设置命名的名称。
周公 2008-12-29
  • 打赏
  • 举报
回复
只用用LinkButton的Command事件吧,省却了很多麻烦,OnCommand与OnClick不一样,OnCommand可以传递参数,而OnClick不能。

62,041

社区成员

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

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

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

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