我正在尝试对位于UserControl中的GridView进行子类化。因此,我希望能够在单独的页面中处理事件。
基本上,我有如下代码:
带GridView的My UserControl:
<%@ 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!");
}
}}
发布于 2011-08-12 02:51:35
你的用户控件是partial class,对吗?
参见C#的partial关键字:
可以将类或结构、接口或方法的定义拆分到两个或多个源文件中。每个源文件都包含类型或方法定义的一部分,并且在编译应用程序时合并所有部分。
它可能看起来像这样
// 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
}
}https://stackoverflow.com/questions/7031101
复制相似问题