这一直困扰着我。
如果我想创建自定义控件,在这种情况下是Datagrid控件的子控件,但我想确保当我将鼠标悬停在特定单元格上时,会出现翻转颜色。如果数据网格没有这样做的任何规定(为了参数的缘故),我是否必须得到鼠标相对于单元格的坐标,然后突出显示最近的单元格?
由于
答案 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,请告诉我。
<强>更新强>
以下部分介绍了您留下的第一条评论。我保留了原件以防有人发现它有用。
为了创建事件驱动控件,您应该实现IPostBackEventHandler
或IPostBackDataHandler
。如果您需要了解这两个接口之间的区别,可以see this question。我宁愿不在这里提供详细信息,因为它会使这个答案太长。
此示例使用IPostBackEventHandler
,但IPostBackDataHandler
非常相似。
你需要做一些事情来处理PostBack事件:
base.Event
键/值集合。在此示例中,我使用的是_EventClick
对象。base.Events[]
设置/注册您的活动,以便在回发中维护活动订阅者。Page.ClientScript.GetPostBackEventReference
。这将生成对ASP.NET的__doPostBack
JavaScript方法的函数调用。您可以在呈现的任何JavaScript事件属性中使用此脚本。 这是ASP.NET LinkButton控件的极少重新创建。大多数“魔法”都发生在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注册脚本。