子类化一个UserControlled GridView



我试图子类化GridView,它位于一个UserControl。因此,我希望能够在单独的页面中处理事件。

基本上我有如下代码:

My UserControl with a GridView:

<%@ Control Language="C#" AutoEventWireup="false" CodeBehind="StdList.ascx.cs" Inherits="UCS_Web.uP.UserControls.StdList" %>
<div>
<asp:Panel ID="Panel1" runat="server">
<asp:GridView ID="_gridView" runat="server" PageSize="6" 
        GridLines="None" AutoGenerateColumns="False" 
        OnRowCommand="_gridView_RowCommand" AutoGenerateEditButton="false" 
        OnDataBound="_gridView_DataBound" OnPreRender="_gridView_PreRender">
        <FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
        <HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" HorizontalAlign="Left" CssClass="gridViewHdr" />
        <SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />
    </asp:GridView>
</asp:Panel>

使用UserControl的页面应该是这样的:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="BypassReasonsPage.aspx.cs" Inherits="UCS_Web.uP.Tools.BypassReasonsPage" %>
<%@ Register Src="~/uP/UserControls/StdList.ascx" TagName="List" TagPrefix="uc" %>
<body>
<form id="form1" runat="server">
    <div>
        <uc:List ID="uc_list" runat="server" />
    </div>
</form>

后面的代码:

uc_list.GridView.DataSource = this.TCW.Copy.bypassReasons;
uc_list.GridView.DataBind();

为了使这个页面工作,我包含了这个文件,它设置了哪些列是数据绑定的,等等:

public class BypassReasonsByToolTable : UCS_Web.uP.UserControls.StdList.ICustomTable
{      
  public DataControlField[] Columns
  {
     get
     {
         BoundField col1 = new BoundField();
         col1.DataField = "Code";
         col1.HeaderText = "Code";
         col1.SortExpression = "Code";
         col1.ItemStyle.Width = new Unit(50, UnitType.Percentage);
         BoundField col2 = new BoundField();
         col2.DataField = "Text";
         col2.HeaderText = "Text";
         col2.SortExpression = "Text";
         col2.ItemStyle.Width = new Unit(50, UnitType.Percentage);
         TemplateField editReason = new TemplateField();
         editReason.ItemTemplate = new addTemplate();
         return new DataControlField[] { col1, col2, editReason };
     }
  }

我希望能够有OnRowCommand, OnRowDelete和所有事件处理程序在一个单独的文件,而不是在UserControl的CodeBehind。我该怎么做呢?

我尝试将它们作为虚拟类并在我使用它们的页面上重写它们,但这不起作用。还有其他的方法吗?

编辑:UserControl CodeBehind

namespace UCS_Web.uP.UserControls
{
   public partial class StdList : UserControl
   {
      private ICustomTable m_custom = null;
protected void _gridView_DataBound(object sender, EventArgs e)
  {
      if (_gridView.Rows.Count > 0)
      {
          for (int i = _gridView.Rows.Count + 1; i <= _gridView.PageSize - 1; i++)
          {
              GridViewRow row = new GridViewRow(
                      0,
                      0,
                      DataControlRowType.DataRow,
                  //(i % 2 > 0) ? datacontrolrowstate.normal : datacontrolrowstate.alternate);
                      DataControlRowState.Alternate);
              foreach (DataControlField field in _gridView.Columns)
              {
                  TableCell cell = new TableCell();
                  cell.Text = "&nbsp;";
                  row.Cells.Add(cell);
              }
        //row.Attributes.Add("OnClick", "javascript:alert();");
              row.BackColor = System.Drawing.ColorTranslator.FromHtml("#ffffff");
              _gridView.Controls[0].Controls.AddAt(i, row);
          }
      }
  }
protected void _gridView_RowCommand(object sender, GridViewCommandEventArgs e)
  {
      if (e.CommandName == "Delete")
      {
          //DO MY DELETE STUFF FOR THIS SPECIFIC PAGE
      }
  }
}

编辑:我的新的覆盖函数添加到。cs文件(尝试了许多变化,但这是当前的)

namespace UCS_Web.uP.UserControls
{
public class MyStdList : StdList
{
    protected override void _gridView_RowCommand(object sender, GridViewCommandEventArgs e){
        Response.Redirect("HERPA DERP!");
    }
}

}

您的用户控件是partial class对吗?

参见c#的部分关键字:

可以将类或结构、接口或方法的定义拆分为两个或更多的源文件。每个源文件都包含类型为或的部分方法定义,所有部分在应用程序运行时组合在一起编译。

可以是这样的

// MyOtherFile.cs:
namespace MyWebSite.UserControls
{
    public partial class MyUserControl : System.Web.UI.UserControl
    {
        protected override void OnInit(System.EventArgs e)
        {
            base.OnInit(e);
            _gridView.OnRowCommand += _gridBiew_RowCommand;
            _gridView.OnDataBound += _gridView_DataBound;
        }
        // events here...
    }
}

要在子类中重写你的方法,基类StdList需要有virtual的方法和/或属性。

参见c#的虚拟关键字:

virtual关键字用于修改方法、属性、索引器或事件声明并允许以便在派生类中重写它。例如,这个方法可以被任何继承它的类重写:

  namespace UCS_Web.uP.UserControls
  {
      public partial class StdList : UserControl
      {
          private ICustomTable m_custom = null;
      }
      protected virtual void _gridView_DataBound(object sender, EventArgs e)
      {
          if (_gridView.Rows.Count > 0)
          {
              for (int i = _gridView.Rows.Count + 1; i <= _gridView.PageSize - 1; i++)
              {
                  GridViewRow row = new GridViewRow(
                          0,
                          0,
                          DataControlRowType.DataRow,
                      //(i % 2 > 0) ? datacontrolrowstate.normal : datacontrolrowstate.alternate);
                          DataControlRowState.Alternate);
                  foreach (DataControlField field in _gridView.Columns)
                  {
                      TableCell cell = new TableCell();
                      cell.Text = "&nbsp;";
                      row.Cells.Add(cell);
                  }
            //row.Attributes.Add("OnClick", "javascript:alert();");
                  row.BackColor = System.Drawing.ColorTranslator.FromHtml("#ffffff");
                  _gridView.Controls[0].Controls.AddAt(i, row);
              }
          }
      }
      protected virtual void _gridView_RowCommand(object sender, GridViewCommandEventArgs e)
      {
              // I do nothing for now... A subclass could override me and do very nice stuff
      } 
  }

  namespace UCS_Web.uP.UserControls
  {
      public partial class SpecialStdList : StdList { }
      protected override void _gridView_RowCommand(object sender, GridViewCommandEventArgs e)
      {
          // I do very nice stuff
      } 
  }

最新更新