2009-06-06 4 views
1

이것은 항상 나를 혼란스럽게 만들었습니다.이벤트 및 사용자 지정 서버 컨트롤에 대한 질문

맞춤 컨트롤 (이 경우에는 Datagrid 컨트롤의 자식)을 만들고 싶지만 마우스를 특정 셀 위로 가져 가면 롤오버 색상이 표시되도록하고 싶습니다. DataGrid에이 작업을 수행 할 수있는 조항이없는 경우 셀 관련 마우스 좌표를 가져온 다음 가장 가까운 셀을 강조 표시해야합니까?

덕분에

답변

2

롤오버 색상은 스타일 시트 또는 자바 스크립트를 사용하여 정의해야합니다. 이것은 ASP.NET을 통해 직접 제어되지 않습니다. 서버 컨트롤이 마우스 오버 스타일을 정의하는 데 사용할 CSS 클래스를 생성하거나 인라인 JavaScript를 생성해야합니다.

CSS를 사용하는 것이 가장 좋지만 IE6에서는 작동하지 않습니다 (IE7에서는 기억이 안납니다). 이 예제에서는 컨트롤이 데이터 표를 HTML 표로 생성한다고 가정합니다. 귀하의 질문에 "사용자 지정 서버 컨트롤"이 나와 있기 때문에 다른 마크 업으로 컨트롤을 렌더링하는 경우에는 다를 수 있습니다. 표의 CSS 클래스가 MyDataGridClass인지 확인하십시오. 당신은 전체 행을 선택하려면

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

, 당신은 위의 예에서 tdtr에를 변경합니다.

IE6에서 호버 스타일을 원한다면 하나의 셀만 강조 표시하면 각 셀 안에 <a /> 태그를 사용하면 더 잘 수행 할 수 있습니다. IE6는 단지이 작동합니다 이유입니다, <a /> 태그를 작동하지만 위의 6으로되지 않도록 잘못 가져가 의사 선택을 구현

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

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

이 예를 들어 당신이이 것을 물론, 가정 컨트롤이 배치 될 페이지에 CSS를 내장 할 수있는 기능. 어떤 이유로 든이 옵션이 없으면 자바 스크립트 경로를 사용할 수 있지만 이렇게하는 것이 바람직한 방법은 아닙니다. 자바 스크립트를 사용하는 방법에 관심이 있다면 알려 주시기 바랍니다.

업데이트 :
아래 섹션은 남긴 첫 번째 의견을 설명합니다. 누군가가 유용하다고 생각하면 원본을 보관했습니다.


는 이벤트 구동 제어를 만들려면, 당신은 IPostBackEventHandler 또는 IPostBackDataHandler 구현해야합니다. 이 두 인터페이스의 차이점을 이해해야 할 경우 see this question을 사용할 수 있습니다. 나는이 대답을 너무 오랫동안 만들 것이기 ​​때문에 여기에 세부 사항을 포함시키지 않을 것이다.

이 예제에서는 IPostBackEventHandler을 사용하지만 IPostBackDataHandler은 꽤 비슷합니다.

당신은 다시 게시 이벤트를 처리하기 위해 몇 가지 작업을 수행해야합니다

  • 이 이벤트에 대한 식별자로 사용할 수있는 키를 만듭니다. 키/값 컬렉션 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); 
    } 
} 

당신이 당신의 컨트롤을 추가 자바 스크립트 로직을 포함 할 경우

, 난 당신이 ASP.NET으로 스크립트를 등록하는 방법을 볼 수 ASP.NET과 자바 스크립트를 포함에 this article을 읽으십시오.

+0

감사합니다. 나는 너에게 다른 것을 보여줄 필요가 없을 것이다. js를 사용하여 특정 행/셀을 강조하는 방법에 대한 아이디어가 있습니다. 사용자 지정 컨트롤 및 이벤트에 대해 알아야 할 때이 질문을 던집니다 (좋은 링크를 알고 있다면 자유롭게 나열 할 수 있습니다). :). – dotnetdev

+0

@dotnetdev 귀하의 의견에 따라 찾고 있다고 말한 것과 일치하도록 답변을 변경했습니다. 바라기를 이것은 당신이 찾고 있었던 것보다 더 많습니다. –

+0

사실 두 답변 모두 매우 유용했습니다. 요약하면, DataGrid의 행이나 셀을 강조하는 가장 쉬운 방법은 필요한 스타일 (css가 스킨 등을 통해 컨트롤의 일부임을 보장)이있는 순수한 CSS를 통해서입니다. 이것은 본질적으로 귀하가 제공 한 첫 번째 방법입니다. – dotnetdev

관련 문제