我试图子类化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 = " ";
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 = " ";
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
}
}