Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

그리드뷰에 DataBind 시키기

그리드뷰는 기본적으로 SqlDataSource를 통해서 자동화를 통해서 SQL server나 XML이나 연결을 해 줄 수 있지만 내가 원하는대로 데이터를 바인드 시키기를 원할 때가 생겼다.

하려고 했던 것은 쇼핑몰사이트의 리스트를 GridView로 만들었는데 이 리스트가 기본적으로는 모든 물품의 리스트를 보여주고 있었다. 하지만 여러가지의 리스트가 필요했는데 예를 들면 카테고리를 눌렀을때는 카테고리의 물품만 보여줘야 했고 검색을 눌렀을때는 검색의 리스트를 보여주어야 했으며 판매자를 누르면 판매자의 리스트를 보여주어야 했다.

물론 가장 간단한 방법은 페이지를 여러개 만드는거다. 그리드뷰디자인을 하고 똑같은 페이지를 4개찍어낸 다음 데이터소스만 다르게 해놓고 그에 걸맞게 링크를 연결해 주면 된다.

하지만 이런 점은 나중에 수정상의 문제도 있을것 같고 비효율적인 듯이 보였다.

그다음에 생각한 것은 멀티뷰였다. 한파일에 멀티뷰를 넣어놓고 그 안에 뷰를 4개 만들어 놓고 날라온 파라미터 null체크해서 조건만들어서 그에 맞는 뷰를 Activate해주면 된다. 하지만 여기서도 그리드뷰는 4개나 필요했다...

그래서 고민끝에 그리드뷰는 하나만들어 놓고 DataBind를 시키기로 했다.


DataSet set = new DataSet();
SqlDataAdapter ad = new SqlDataAdapter(query, ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);
ad.Fill(set);
return set;

비연결지향으로 연결해서 DataSet으로 원하는 값의 데이터를 모두 받아왔다. 물론 query는 string으로 만은 쿼리문이다. 쿼리문 날리면 DataSet으로 반환해 주는 메서드를 따로 만든 것이다. (중간 메서드들이 있지만 그냥 머 핵심만 보면 되니까...)


GridView1.DataSourceID = "";
GridView1.DataSource = dao.GetDataSet();
GridView1.DataBind();

이걸 aspx.cs 부분에서 그리드뷰에 직접 바인드를 시킨것이다. DataSource부분에 받아온 DataSet을 할당하고 DataBind()를 시키면 된다.

DataSourceID는 GridView1에 자동화로 연결된 DataSouce가 있으면 aspx파일의 소스부분에 이에 대한 부분이 있어서 DataSourceID가 부여된 부분이 있어서 이렇게 바인드 시키면 충돌이 나서 에러가 나기 때문에 DataSourceID를 지워준 것이다.



일단 위처럼 해서 해결하기는 했는데 자세히는 잘 모르겠다. 물론 바인드하는데 여러가지 방법들이 있을 것이다.

처음에는 ArrayList로 받아서 넘겨주려고 했다. 제대로 잘 바인드되고 돌아가기는 했는데 먼가 이상했다. 3개가 떠야 하는데 2개만 뜬다던지 아니면 같은게 2개 뜬다든지 하는 문제가 있었다. 먼가 문제가 있는데 하는 생각에 만지다가...

DataReader를 직접 넘기면 된다고 해서 Reader를 받아서 바인드 시켰더니 이건 바인드는 잘 되는것 같은데 GridView에서 페이징을 사용하기로 해놨더니 "이 데이터는 페이징을 할 수 없다"는 에러메시지가 나왔다. 물론 페이징을 자동화 되어 있는거 말고 따로 만든다면 될지도 모르겠다.

그래서 결국은 비연결지향을 사용해서 DataSet으로...

역시나 자동화 되어 있는건 빠르게 할 수는 있는데 자동화와 수동화의 가운데서 엄청 해메고 있다.. ㅡ..ㅡ



덧)))

더 좋은 방법이 있었다. ㅡ..ㅡ 머 서브쿼리같은거까지 쓰면 좀 그렇긴 하지만 그냥 그리드뷰만 하나만들어놓고 SqlDataSource만 여러개 만들어놓고 연결하면 된다. 그러면 굳이 C#코드에 메서드를 따로 안만들어도 된다. 그리고 소스에서 쿼리문도 고쳐줄수 있으니까.


GridView.DataSourceID = "";
GridView.DataSource = SqlDataSource1;
GridView.DataBind();

2007/07/18 02:16 2007/07/18 02:16