─━ IT ━─

마우스로 포인트된 데이터 그리드 행을 강조 표시하기 쉬운 방법

DKel 2021. 8. 16. 00:39
반응형
첫 번째 DataGrid 컨트롤은 데이터를 표시하기 위한 매우 강력하고 범용적인 컨트롤로서 ASP.NET 개발자에게도 친숙하다(DataGrid 취급에 익숙하지 않은 사람들은 우선 Scott Mitchell의 기사 ′An Extensive Examination of the DataGrid Control′을 읽기를 권장한다.나는 지금까지 많은 프로젝트에서 Data Grid 컨트롤을 사용을 해서 Data Grid의 외형을 더욱 좋게 만들려고 노력했다.그 중의 하나로 현재 Yahoo! Mail이나 Hotmail등의 사이트에서 이용되고 있는 것이, 마우스로 포인트 된 행을 자동적으로 하이라이트 표시하는 테크닉이다.즉, 최종 사용자가 Data Grid의 데이터 위에 마우스를 가져왔을 때 현재 마우스가 놓여 있는 Data Grid 행의 배경은 다른 행과 다른 색이 되는 것이다.DataGrid 컨트롤을 확장해서 이 기능을 추가하는 방법에 대해서는 이미 수많은 기사가 나와있기 때문에 마우스의 움직임에 따라 행을 하이라이트 하는 방법을 이미 알고 있는 사람도 많을 수 있다.이 방법의 한 예가 Scott의 ′Creating a Row-Selectable Data Grid Control′이다.이 기사나 그 밖의 많은 기사들에서 다루고 있는 것이 DataGrid를 확장하는 커스텀 ASP.NET 서버 컨트롤을 작성한다고 하는 솔루션으로 커스텀 서버 컨트롤에서 행을 하이라이트 표시하기 위한 클라이언트 사이드 스크립트를 발행하는 형식이다(특히 HTML 요소에는 onmouseover 속성과 onmouseout 속성이 추가되어 있다).커스텀 서버 컨트롤을 작성하는 방법은 간단하고 유용한 정보도 많다.그러나 나는 좀 더 단순한 접근방식으로 표준 Data Grid 컨트롤을 일체 변경하지 않고 동작하는 것을 만들고 싶다고 생각했다.이것을 실현하는 방법은, AListApart의 Web 사이트에서, CSS만으로 드롭 다운 메뉴를 작성하는 방법에 대한 기사를 읽은 후에 생각해 냈다.이 컨셉은 단순하고, 「CSS의 hover 스타일을 이용해, 다양한 계층 형식의 리스트의 표시/숨김을 전환한다」라고 하는 것이었다.나는 그 단순함과 참신한 컨셉에 마음이 끌렸고, 이를 조금만 손질하면 Data Grid의 행도 강조 표시할 수 있지 않을까 생각했다.내가 어떻게 클라이언트 사이드 CSS의 hover 기능을 이용해서 표준 Data Grid에 행의 하이라이트 표시 기능을 추가했는지를 설명한다.완성되기까지의 과정에 몇 가지 문제가 있었지만 그 문제와 회피 방법에 대해서도 설명한다.계속 읽기 전에, 우선 실제의 데모를 봐 주기 바란다.첫걸음 : DataGrid에 데이터를 표시하는 것이 당연하지만 DataGrid 내의 행을 강조표시하기 위해서는 조작대상이 되는 DataGrid가 필요하다.다음은 데이터를 Data Grid에 바인드하는 샘플로 작성한 페이지의 코드이고, 위의 데모 페이지는 이 페이지에 기능을 추가해서 완성시킨 것이다.< % @ Page Language = ′ C# ′ % >
< % @ Import Namespace = ′ System . Data ′ % >

< html >
< head >
< title > DataGrid Sample < / title >

< script runat = ′ server ′ >
private void Page _ Load ( object sender , EventArgs e )
{
if ( ! Page . IsPostBack )
BindGrid ( ) ;
}

private void BindGrid ( )
{
DataTable table = new DataTable ( ′ Users ′ ) ;
table . Columns . Add ( ′ firstName ′ ) ;
table . Columns . Add ( ′ lastName ′ ) ;
table . Columns . Add ( ′ emailAddress ′ ) ;

AddRow ( table , ′ Bugs ′ , ′ Bunny ′ , ′ bbunny@wb.com ′ ) ;
AddRow ( table , ′ Mickey ′ , ′ Mouse ′ , ′ mmouse@disney.com ′ ) ;
AddRow ( table , ′ Donald ′ , ′ Duck ′ , ′ dduck@disney.com ′ ) ;
AddRow ( table , ′ Dan ′ , ′ Marino ′ , ′ dmarino@dolphins.com ′ ) ;
AddRow ( table , ′ Steve ′ , ′ Stchur ′ , ′ sstchur@yahoo.com ′ ) ;

myGrid . DataSource = new DataView ( table ) ;
myGrid . DataBind ( ) ;
}

private void AddRow ( DataTable table , string firstName ,
string lastName , string email )
{
DataRow row = table . NewRow ( ) ;
row [ ′ firstName ′ ] = firstName ;
row [ ′ lastName ′ ] = lastName ;
row [ ′ emailAddress ′ ] = email ;
table . Rows . Add ( row ) ;
}
< / script >
< / head >

< body >
CellPadding = ′ 5 ′
AutoGenerateColumns = ′ false ′
Font - Name = ′ verdana ′
Font - Size = ′ 10pt ′
runat = ′ server ′ >

< HeaderStyle BackColor = ′ # 336699 ′
ForeColor = ′ # ffffff ′ Font - Bold = ′ true ′ / >


< Columns >
DataField = ′ firstName ′ / >
DataField = ′ lastName ′ / >
DataField = ′ emailAddress ′ / >
< / Columns >
< / asp : DataGrid >
< / body >
실제 데모 표시 이 시점의 Data Grid 는 하드코딩된 데이터에 바인드 된 극히 단순한 것이다.실제 데모를 보더라도 알 수 있듯이, 이 예에서는 Header Style로 표제행의 배경색을 차분한 파란색으로 설정하고, Alternating Item Style 속성에서 행의 배경색을 한 줄 간격으로 밝은 회색으로 설정하고 있다.최초의 실험행을 ′하이라이트 표시 가능′으로 하기 위해서, 우선 단순하게, 페이지상의 모든 TR(table row) 요소에 다음과 같은 CSS 스타일을 추가해 보았다.< style type = ′ text / css ′ >
tr : hover { background - color : # ffccff ; }
DataGrid 내의 각 행은 요소로 표현되어 있기 때문에 이 CSS를 적용하면 사용자가 DataGrid의 행을 마우스로 포인트 했을 때 행의 배경이 핑크(#ffccff)가 될 것이라고 생각한 것이다.이 방법을 먼저 웹 브라우저의 파이어폭스를 통해서 테스트를 해보았는데, 마우스로 포인트를 주면 Data Grid의 행이 하이라이트 표시가 되었다.그러나 문제는 표제행을 포함한 모든 Data Grid의 행이 강조 표시된다는 것이었다.또, 이 CSS를 Internet Explorer(IE)로 테스트하면, 전혀 하이라이트 표시되지 않는 것으로 나타났다.Internet Explorer에서도 동작하도록 수정 조사한 결과, IE는 하이퍼링크(태그)에만 : hover 를 지원하고 있는 것을 알았다.다행히 이 문제는 일부 자바스크립트와 CSS 스타일시트를 조금만 손질해도 쉽게 해결할 수 있었다.구체적으로는 tr의 수준에 over라는 클래스를 정의하고, :hover와 같은 CSS를 적용한 것이다.그 결과, CSS 스타일시트는 다음과 같이 되었다. 당연하지만, 이 변경만으로는 문제가 해결되지 않았다.아직 Data Grid의 요소를 over 클래스와 관련짓는 작업이 남아 있다.행이 마우스로 포인트 되었을 때 각 요소의 class 속성을 over로 설정하기 위해서는 약간의 JavaScript 를 기술할 필요가 있다.= 스크립트 언어 = ′javascript′
시작 = 기능 강조 표시
{
if(가명)all & document.getElementByID)
{
navRoot = document.getElementById(데이터 그리드의 ID);

// TBODY 요소에 대한 참조 가져오기
tbody = navRoot.childNodes[0];

(i = 0; i = 자식 노드).길이; i++)
{
노드 = tbody.childnodes[i];
if(node.nodeName == ′TR′)
{
node.onmouseover= 함수 명령
{
this.className = ′over′;
}

node.onmouseout= 함수 명령
{
this.className = this.className.replace(′over′, ′′);
}
}
}
}
}

window.onload = startHighlight;
実際のデモを表示上記のスクリプトでは、datagridのすべての子要素について検索を開始するようブラウザに指示している(注:id of datagridの部分は、datagridに基づいて描画されるコントロールのクライアントサイドidに置き換える必要がある。datagridがユーザーコントロール、別のdatagrid、またはその他の名前付きコンテナ内に置かれていない場合、このID → DataGrid Web → → → → → → →idプロパティと等しくなる)。このスクリプトは、ノード名がtrのdatagrid要素を見つけると、その要素にonmouseover関数とonmouseout関数を追加する。これらの関数を追加する目的は、単純にがマウスでポイントされているかどうかに応じて、そのcssクラスをoverまたはnothingにieでテストすると、奇妙な点に気付く。表内の行が1行おきにしかハイライト表示されないのだ。これは、alternatingitemstyleによって、行の背景色を1行おきに明るい灰色(#eeeeee)にするようdatagridに指示しているかnetはこのスタイルをインラインで描画するため、このスタイルの方がjavascriptで指定したcssクラスよりも優先される。事実、itemstyleを同様に指定した場合には、まったく同じ理由で行が1つもハイライト表示さtrがマウスでポイントされているときに、すべてのtd要素(trの子要素)が、それにアタッチされたcssクラスoverを受け取るようにすればよい。td要素に設定されたスタイルは親(tr要素)のスタイルよりも優先されるので、この方法で正しく表示される。修正後のcssは次のようになる。 ヘッダー行のハイライト表示の抑制ie固有の問題はこれで解決した。しかし、まだ見出し行がハイライト表示されてしまう問題が残っている。さてどうしたものか。気付いた方もいるかもしれないが、ie対応のjavascriptのコードでは、テーブル(datagrid)内のすべての行を1つずつループ処理している。そこで、次のように行インデックスを0ではなく1から開始して、1行目(ヘッダー行)をスキップすることでこ
(i = 1; i = child nodes).길이; i++)
{
// 이 코드는 그대로 유지됩니다.
} 実際のデモを表示このコードをieでテストすると、ヘッダー行をマウスでポイントしてもハイライト表示されないようになる。また、cssスタイルシートにtdを追加したため、ieでもdatagrid内の行が1行おきではなくすべてハイライト表示されるようになっている。では、firefox(やその他のie以外のブラウザ)ではどうしたらよいだろうか。この問題を解決するには、特定のtr要素にのみhoverスタイルを適用することをブラウザに指示する必要がある。もっとも、cssでは簡単に実現できる。具体的には次のようになる。このcssでは、cssクラスがrowであるtr要素にのみhoverスタイルを適用することをブラウザに指示している。ここまででは、datagrid内のtr要素にcssクラスが関連付けられていないので、このままではうまく動作しない。これを修正するには、datagridのAlternatingItemStyle에 있는 ItemStyle은(는) CssClass에 있는 파일입니다.
実際のデモを表示まとめこれで完成である。簡単にdatagrid内の行をハイライト表示することができ、コードの量もこれまでに見たり実装したことのある他ie 6.0とfirefox 1.0のみであるということだ。他のブラウザでどのような動作になるかはわからない(netscape 7とie 5.5ではおそらく正常に動作すると思う)。他のブラウザで正常に動作しない場合は、javaA List Apart.comに掲載されたpatrick griffithsとdan webbの記事「어리버리fish dropdown」から借用したものだ。この記事にはcssについての非常に有意義な内容なので、ぜひお読みになることをお勧めする。프로그래머에게 행복하라!
반응형
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

방문자수Total

  • Today :
  • Yesterday :