有关事件和自定义服务器控件的问题

时间:2009-06-06 23:06:19

标签: asp.net

这一直困扰着我。

如果我想创建自定义控件,在这种情况下是Datagrid控件的子控件,但我想确保当我将鼠标悬停在特定单元格上时,会出现翻转颜色。如果数据网格没有这样做的任何规定(为了参数的缘故),我是否必须得到鼠标相对于单元格的坐标,然后突出显示最近的单元格?

由于

1 个答案:

答案 0 :(得分:2)

应使用样式表或JavaScript定义翻转颜色。这不会通过ASP.NET直接控制。您应该让服务器控件生成要用于定义悬停样式的CSS类,或生成内联JavaScript。

使用CSS是最好的选择,但它不适用于IE6(也许IE7,我不记得了)。此示例假定您的控件将数据网格生成为HTML表。由于您的问题是“自定义服务器控件”,如果您使用不同的标记呈现控件,则可能会有所不同。确保您的表格具有MyDataGridClass的CSS类。

.MyDataGridClass td:hover {
    background: #999;
}

如果要突出显示整行,可以在上面的示例中将td更改为tr

如果您想在IE6中使用悬停样式并且只需要突出显示单个单元格,则可以通过在每个单元格中使用<a />标记来做得更好。 IE6错误地实现了悬停伪选择器,因此它只适用于<a />标签,这就是为什么这样做的原因,但上面的内容不适用于IE6:

.MyDataGridClass a {
    display: block;
    width: 100%;
    height: 100%;
    padding: 0px;
    margin: 0px;
}

.MyDataGridClass a:hover {
    background: #999;
}

当然,这个例子假设您能够将CSS嵌入到您的控件所在的页面中。如果由于某种原因您没有此选项,则可以使用JavaScript路由,但这不是首选的方法。如果您有兴趣了解如何使用JavaScript,请告诉我。

<强>更新
以下部分介绍了您留下的第一条评论。我保留了原件以防有人发现它有用。


为了创建事件驱动控件,您应该实现IPostBackEventHandlerIPostBackDataHandler。如果您需要了解这两个接口之间的区别,可以see this question。我宁愿不在这里提供详细信息,因为它会使这个答案太长。

此示例使用IPostBackEventHandler,但IPostBackDataHandler非常相似。

你需要做一些事情来处理PostBack事件:

  • 创建一个密钥以用作事件的标识符。这用于base.Event键/值集合。在此示例中,我使用的是_EventClick对象。
  • 使用base.Events[]设置/注册您的活动,以便在回发中维护活动订阅者。
  • 渲染控件时,请致电Page.ClientScript.GetPostBackEventReference。这将生成对ASP.NET的__doPostBack JavaScript方法的函数调用。您可以在呈现的任何JavaScript事件属性中使用此脚本。

这是ASP.NET LinkBut​​ton控件的极少重新创建。大多数“魔法”都发生在AddAttributesToRender()RaisePostBackEvent()方法中。

public class ControlWithEvent : WebControl, IPostBackEventHandler
{
    private object _EventClick = new object();

    protected override HtmlTextWriterTag TagKey
    {
        get { return HtmlTextWriterTag.A; }
    }

    public event EventHandler Click
    {
        add
        {
            base.Events.AddHandler(_EventClick, value);
        }
        remove
        {
            base.Events.RemoveHandler(_EventClick, value);
        }
    }

    public void RaisePostBackEvent(string eventArgument)
    {
        // The value of the 'eventArgument' parameter will be "myOptions" 
        EventHandler handler = (EventHandler)base.Events[_EventClick];
        if (handler != null)
        {
            handler(this, EventArgs.Empty);
        }
    }

    protected override void AddAttributesToRender(HtmlTextWriter writer)
    {
        base.AddAttributesToRender(writer);

        // "myOptions" can be anything, including an empty string.
        // You can use it for your EventArgs object if you need it.
        PostBackOptions options = new PostBackOptions(this, "myOptions");

        string script = Page.ClientScript.GetPostBackEventReference(options, false);

        writer.AddAttribute(HtmlTextWriterAttribute.Onclick, script);
    }

    public string Text { get; set; }

    protected override void RenderContents(HtmlTextWriter output)
    {
        output.Write(Text);
    }
}

如果您想在控件中包含其他JavaScript逻辑,建议您阅读this article,了解如何在ASP.NET中包含JavaScript,以了解如何使用ASP.NET注册脚本。