事情的起因:
gridview中的字段分别是:
checkboxfield,hyperlinkfield,templetefield(模板列中放置了一个linkbutton)
其中hyperlinkfield里绑定了我数据源的id,我想完成的操作:单击模板列的linkbutton的时候,获取当前行的id,然后查找这个hyperlinkfield,从hyperlinkfield中取得datanavigateurl中绑定的id值,然后通过这个id操作我的数据源中的数据
说明:此例子本来是设计成通过单击模板列中的linkbutton来改变新闻的状态,新闻的标题就存在这个hyperlinkfield的datanavigateurl中
事情的经过:
无论如何,我不知道(实际上我已经在linkbutton的click事件中找到了当前行)如何通过当前行来获取这个hyperlinkfield,因为这个hyperlinkfield是没有id的,也不允许有id,所以不能gridviewrow.findcontrol("myid")来查找它,也就得不到它的datanavigateurl值了
事情的结果:
后来只能转变思路,原来gridview的datakeys和datakeynames可以实现我的设想功能
首先,设定我的gridview1.datakeynames = new string []{"newsID"}
然后protected void mybutton_click(object sender,EventArgs e)
{
int index=(gridviewrow)((linkbutton)sender.namingcontainer).rowindex;
string thekey = gridview1.datakeys[index].value.tostring();//这个thekey就是当前行对应的数据库中的我的新闻帖子的id了
}
事情的反思:
可以看出,gridview的datakeynames是标示的是从数据源中的键值字段,比如这个newsID,它来源于我的数据源
(为什么datakeyname后有一个s呢,因为它可以锚定好多个数据源中的key)
一点锚定了datakeynames以后,gridview在加载的时候就会自动的在自己的datakey集合(网上说它不是集合,可是能像集合一样用)中检索出来数据源中的所有行的keys,比如我的新闻ID列可能是
1001
1002
1003
那么datakey={1001,1002,1003}
那么因此通过gridview1.datakeys[index].value就能得到当前行对应的数据源的键值了
看,现在我就可以更新我的新闻了 int currentNewsIndex = Convert.ToInt32(gridview1.datakeys[index].value);
UpdateNews(CurrentNewsIndex,"假如这是我的新闻内容");



终于解决了困扰我两天的问题,从gridview中找寻当前行的数据源id

uxspy
