带有方法的 EventArgs
EventArgs with methods
我目前正在连接一个用户控件,该控件的按钮单击会冒泡到母版页。我看了很多帖子才达到我现在的位置,但我不确定我是否以完全正确的方式做事,以及我是否有最好的抽象水平。
我正在使用自定义事件参数,如下所示:
public class JumpEventArgs : EventArgs
{
readonly int _supplierID;
public int SupplierID
{
get { return _supplierID; }
}
public JumpEventArgs(int supplierID)
{
supplierID.ThrowDefault("supplierID");
_supplierID = supplierID;
}
}
在用户控件中我有这个:
// 这应该从用户控件中抽象出来吗?
public event EventHandler<JumpEventArgs> Jumped;
protected void LinkButtonJump_Click(object sender, EventArgs e)
{
var handler = Jumped;
if (handler != null)
{
var args = new JumpEventArgs(ProductID);
Jumped(this, args);
}
}
我的母版页处理程序执行一些对跳转事件通用的操作,以及一些对页面明确的操作。我一直在琢磨怎么把两者结合起来。
这是母版页:
void AddEventHandlers()
{
var jumpCtls = this.DeepFind<JumpButton>();
jumpCtls.ForEach(uc => uc.Jumped += new EventHandler<JumpEventArgs>(JumpCtl_Clicked));
}
void JumpCtl_Clicked(object sender, JumpEventArgs e)
{
var j = new JumpEvent(e); // this is generic and can be reused
j.AddTrack();
MobileSearch.VisitedList.Refresh(); // this is master page only
}
这是跳转 class:
// 是否应将其与 JumpEventArgs 合并 class?
public class JumpEvent
{
readonly JumpEventArgs _args;
public void AddTrack()
{
// do something
}
public JumpEvent(JumpEventArgs args)
{
args.ThrowNull("args");
_args = args;
}
JumpEventArgs Args
{
get { return _args; }
}
}
我不确定母版页处理程序是否将事件参数传递给通用 class "JumpEvent" - 似乎不太正确 - 我可能想多了,但在我不确定这一天的结束。
感谢任何建议。
您可以为此使用普通按钮。您的 JumpButton 似乎并没有比标准 Button 做更多的事情,所以它似乎只是在增加不必要的复杂性。
<asp:Button id="JumpBtn" OnClick="JumpBtn_Click" CommandArgument="Supplier3" runat="server" Text="Jump!" />
后面的代码:
protected void JumpBtn_Click(object sender, EventArgs e)
{
var supplierId = JumpBtn.CommandArgument; //do something with supplierId
MobileSearch.VisitedList.Refresh();
}
您可以使用内联数据绑定表达式动态绑定 CommandArgument
。如果您的 JumpBtn
应该位于某种控件模板内,例如 Repeater
.
,您也可以将 sender 转换为 Button class
并不复杂。
将按钮添加到页面
<asp:Button ID="ButtonAction" OnClick="ButtonAction_Click" runat="server">
Jump!
</asp:Button>
将点击事件传递给您的自定义事件
protected void ButtonAction_Click(object sender, EventArgs e)
{
if (this.Jumped != null)
{
this.Jumped(this, this.ProductId);
}
}
您的自定义事件
public event EventHandler<int> Jumped;
然后在母版页中使用它
void JumpCtl_Clicked(object sender, int e)
{
var supplierId = e;
// Do what you want
}
我目前正在连接一个用户控件,该控件的按钮单击会冒泡到母版页。我看了很多帖子才达到我现在的位置,但我不确定我是否以完全正确的方式做事,以及我是否有最好的抽象水平。
我正在使用自定义事件参数,如下所示:
public class JumpEventArgs : EventArgs
{
readonly int _supplierID;
public int SupplierID
{
get { return _supplierID; }
}
public JumpEventArgs(int supplierID)
{
supplierID.ThrowDefault("supplierID");
_supplierID = supplierID;
}
}
在用户控件中我有这个:
// 这应该从用户控件中抽象出来吗?
public event EventHandler<JumpEventArgs> Jumped;
protected void LinkButtonJump_Click(object sender, EventArgs e)
{
var handler = Jumped;
if (handler != null)
{
var args = new JumpEventArgs(ProductID);
Jumped(this, args);
}
}
我的母版页处理程序执行一些对跳转事件通用的操作,以及一些对页面明确的操作。我一直在琢磨怎么把两者结合起来。
这是母版页:
void AddEventHandlers()
{
var jumpCtls = this.DeepFind<JumpButton>();
jumpCtls.ForEach(uc => uc.Jumped += new EventHandler<JumpEventArgs>(JumpCtl_Clicked));
}
void JumpCtl_Clicked(object sender, JumpEventArgs e)
{
var j = new JumpEvent(e); // this is generic and can be reused
j.AddTrack();
MobileSearch.VisitedList.Refresh(); // this is master page only
}
这是跳转 class:
// 是否应将其与 JumpEventArgs 合并 class?
public class JumpEvent
{
readonly JumpEventArgs _args;
public void AddTrack()
{
// do something
}
public JumpEvent(JumpEventArgs args)
{
args.ThrowNull("args");
_args = args;
}
JumpEventArgs Args
{
get { return _args; }
}
}
我不确定母版页处理程序是否将事件参数传递给通用 class "JumpEvent" - 似乎不太正确 - 我可能想多了,但在我不确定这一天的结束。
感谢任何建议。
您可以为此使用普通按钮。您的 JumpButton 似乎并没有比标准 Button 做更多的事情,所以它似乎只是在增加不必要的复杂性。
<asp:Button id="JumpBtn" OnClick="JumpBtn_Click" CommandArgument="Supplier3" runat="server" Text="Jump!" />
后面的代码:
protected void JumpBtn_Click(object sender, EventArgs e)
{
var supplierId = JumpBtn.CommandArgument; //do something with supplierId
MobileSearch.VisitedList.Refresh();
}
您可以使用内联数据绑定表达式动态绑定 CommandArgument
。如果您的 JumpBtn
应该位于某种控件模板内,例如 Repeater
.
并不复杂。
将按钮添加到页面
<asp:Button ID="ButtonAction" OnClick="ButtonAction_Click" runat="server">
Jump!
</asp:Button>
将点击事件传递给您的自定义事件
protected void ButtonAction_Click(object sender, EventArgs e)
{
if (this.Jumped != null)
{
this.Jumped(this, this.ProductId);
}
}
您的自定义事件
public event EventHandler<int> Jumped;
然后在母版页中使用它
void JumpCtl_Clicked(object sender, int e)
{
var supplierId = e;
// Do what you want
}