Gridview Linkbutton代码背后

时间:2012-02-03 19:44:02

标签: asp.net

到目前为止,我正在使用VS 2003并最近迁移到VS 2008.我正面临一些特殊问题。

在Vs 2003中,我有一个Datagrid,其中一个字段是ButtonField(链接按钮)。它不是模板字段。用户单击该字段并生成一些数据。

我在dg_ItemCommand

上用Vb编写了一个代码
Strid = Ctype(e.commandsource,linkbutton).text

现在我想对gridview使用相同的方法(我认为datagrid是2008年的gridview)。我在dg_Rowcomand

上写了这样的代码
Private Sub dgSampleCustomer_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs) Handles dgSampleCustomer.RowCommand 
  Try 
    Dim strid As String 
    Dim i As Integer
    strid = CType(e.CommandSource, LinkButton).Text
...

这是一个错误。

  

无法将'System.Web.UI.WebControls.GridView'类型的对象强制转换为   输入'System.Web.UI.WebControls.ButtonField'。

任何人都可以帮助我!

3 个答案:

答案 0 :(得分:2)

我想知道为什么要尝试将命令源转换为LinkBut​​ton?如果要将某些特定于行的信息附加或以其他方式发送到按钮处理程序,则可以使用ButtonField的CommandName和CommandArgument属性执行此操作。

像:

 <asp:Gridview ID="...">
 ...
 <columns>
                <asp:buttonfield buttontype="Link" 
                  commandname="Generate"
                  text="Generate"/>
 ...
</columns>
</asp:GridView>

这可以通过使用:

在事件处理程序中检索
if(e.CommandName=="Generate")
{
  // Convert the row index stored in the CommandArgument
  // property to an Integer.
  string rowIndex = Convert.ToInt32(e.CommandArgument);
  ...
}

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.rowcommand.aspx

更新:(使用DataKeys) 由于e.CommandArgument返回行索引,并且您想要ID,请使用DataKeys集合,首先将您的ID列添加到DataKeyNames集合中......

<asp:GridView ... DataKeyNames="ID">

...然后从DataKeys集合中检索值,如:

GridView sourceGridView = (GridView) e.CommandSource;
rowIndex = Convert.ToInt32(e.CommandArgument);
strID = sourceGridView.DataKeys[rowIndex]["ID"];

答案 1 :(得分:2)

看起来命令的来源是GridView本身,而不是您单击的按钮。您可能想要做的是在Linkbutton的“CommandArgument”属性中设置您要查找的值。标记看起来像这样:

<asp:LinkButton ID="myLinkButton" runat="server"
    CommandName="MyCommandName"
    CommandArgument="MySpecialValue"
    Text="Click Me" />

然后,如果您只是:

' strid = "MySpecialValue"
strid = e.CommandArgument.ToString()

现在,您可以轻松地从命令中获取ID,而不是从控件名称中提取ID。在这种特殊情况下,CommandName是可选的,但如果网格上有多个执行不同操作的按钮(例如“编辑”和“删除”),则会派上用场。然后,您可以使用命令名在同一事件中以自己的方式处理每个命令:

If (e.CommandName = "Edit") Then
    ' Do Some Edit Code
End If

答案 2 :(得分:0)

您可以在rowcommand事件中尝试此操作

Dim index = Convert.ToInt32(e.CommandArgument)      
Dim row = dg.Rows(index)      
'find your linkbutton in template field (replace "lnkBtn" with your's)
Dim myLinkButton = CType(row.FindControl("lnkBtn"), LinkButton)
Dim strid As String = myLinkButton.Text

如果有帮助,请告诉我。