2011-12-01 46 views
1

我想利用LinkButton可用属性的广度,与CommandField相比。当从点击调用方法背后的代码我收到此错误信息:尝试通过asp转换功能性asp:CommandField到asp:LinkBut​​ton:TemplateField

CS0123:没有重载“的ViewHandler”匹配委托 “System.EventHandler”。

GridView的定义:

<asp:GridView ID="wc" EmptyDataText="Empty WC table..." runat="server" 
AutoGenerateColumns="False" GridLines="Horizontal" DataKeyNames="WC_ID,PW_ID,R_Qty" 
CssClass="mGrid" PagerStyle-CssClass="pgr" AlternatingRowStyle-CssClass="alt" 
AllowSorting="true" OnSorting="Sorting" AllowPaging="true" PageSize="15" ViewStateMode="Enabled" 
OnSelectedIndexChanging="ViewHandler" OnPageIndexChanging="HandlePageIndexChanging" OnRowDataBound="gvRowDataBound" 
OnRowEditing="gvRowEditing" OnRowCancelingEdit="gvRowCancelingEdit" OnRowUpdating="gvRowUpdating"> 

原稿按钮...

<asp:CommandField ControlStyle-Font-Size="Smaller" ControlStyle-ForeColor="#717171" HeaderText="..." ShowSelectButton="True" ItemStyle-HorizontalAlign="Center" SelectText="..." />  

转换为....

<asp:TemplateField HeaderText="..." ShowHeader="True" ItemStyle-HorizontalAlign="Center"> 
     <ItemTemplate> 
      <asp:LinkButton style="font-size: 0.9em; color: #717171" ID="Details" runat="server" CausesValidation="False" OnClick="ViewHandler" CommandName="ViewHandler" Text="..." ToolTip="Click here to see purchase history and notes"></asp:LinkButton> 
     </ItemTemplate> 
    </asp:TemplateField> 

后面的代码:

protected void ViewHandler(object sender, GridViewSelectEventArgs e) 
    { 
     string WC_ID =wc.Rows[e.NewSelectedIndex].Cells[0].Text; 
     string PW_ID = wc.Rows[e.NewSelectedIndex].Cells[1].Text; 
     string VIN = wc.Rows[e.NewSelectedIndex].Cells[2].Text; 
     string PROD = wc.Rows[e.NewSelectedIndex].Cells[3].Text; 
     string W = wc.Rows[e.NewSelectedIndex].Cells[4].Text; 
     string SIZE = wc.Rows[e.NewSelectedIndex].Cells[5].Text; 
     e.Cancel = true; 
     Session.Add(WebConstants.WC_ID, WC_ID); 
     Session.Add(WebConstants.PW_ID, PW_ID); 
     Session.Add(WebConstants.VIN, VIN); 
     Session.Add(WebConstants.PROD, PROD); 
     Session.Add(WebConstants.W, W); 
     Session.Add(WebConstants.SIZE, SIZE); 
     DetailsNavigateMethod.DynamicInvoke(); 
     HandlePageNavigation(WebConstants.WC_DETAILS, "WC View for WC_PurchaseID-> " + Session[WebConstants.WC_ID].ToString()); 
    } 

什么我需要做的,使签名的比赛用ViewHandler方法?我也注意到,如果我从GridViewSelectEventArgs切换到EventArgs过载错误消失但随后e.NewSelectedIndex不存在...

谢谢!

回答

0

你的问题是,对于一个LinkButtonOnClick事件处理程序必须有这样的签名:

protected void LinkButton_Click(Object sender, EventArgs e) 

但你将它定义为

protected void ViewHandler(object sender, GridViewSelectEventArgs e) 

但是,您将无法访问到E .NewSelectedIndex,效果显着。你可以做的是改变您的标记(注意CommandArgument部分):

<asp:TemplateField HeaderText="..." ShowHeader="True" ItemStyle-HorizontalAlign="Center"> 
     <ItemTemplate> 
      <asp:LinkButton style="font-size: 0.9em; color: #717171" ID="Details" runat="server" CausesValidation="False" OnClick="ViewHandler" CommandName="ViewHandler" CommandArgument='<%=string.Format("{0},{1},{2},{3}",Eval("Prop1"),Eval("Prop2"),Eval("Prop3"),Eval("Prop4")) %>' Text="..." ToolTip="Click here to see purchase history and notes"></asp:LinkButton> 
     </ItemTemplate> 
    </asp:TemplateField> 

和代码下载到:

protected void LinkButton_Click(Object sender, EventArgs e) 
{ 
     string [] values = ((LinkButton)(sender)).CommandArgument.Split(new char[]{','}); 
     //where values[0] will have WC_ID, values[1]=PW_ID, etc, 
     Session.Add(WebConstants.WC_ID, values[0]); 
     Session.Add(WebConstants.PW_ID, values[1]);//etc... 
     //Session.Add(WebConstants.VIN, VIN); 
     //Session.Add(WebConstants.PROD, PROD); 
     //Session.Add(WebConstants.W, W); 
     //Session.Add(WebConstants.SIZE, SIZE); 
     DetailsNavigateMethod.DynamicInvoke(); 
     HandlePageNavigation(WebConstants.WC_DETAILS, "WC View for WC_PurchaseID-> " + Session[WebConstants.WC_ID].ToString()); 
} 

注:

  1. Prop1, Prop2, etc.必须改变到数据源中的实际属性名称。
  2. 以上代码尚未经过测试,但是这是想法。
+0

我得到的这个JIST ...的CommandArguments串正在建错了,但我能明白这一点 - 谢谢! – kmm