Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.

그리드뷰에 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

그리드뷰에서 필드표현을 자유롭게 하기

그냥 책보고 그리드뷰따라하는 걸 벗어나서 간단한 웹사이트를 만들다 보니 단순히 거의 반자동으로 클릭 몇번으로만 만들 수 있는 그리드뷰는 사용상에 제약이 많았다.

그래서 이것저것 뒤져보았다. MS가 이렇게 멍청하게 만들지는 않았을테고(이게 머 위지윅도 아니고..) 먼가 있을텐데 하면서 찾아보다가 겨우 찾았다.

바로 TemplateField다.

일단 내가 하려고 했던건 그리드뷰에서 특정항목에서 이미지를 표현하고 싶었는데 값에 따라 다르게 하고 싶었다. 값이 없는건 안나타나고 값이 있을때만 이미지랑 값이 나타나도록....

사용자 삽입 이미지


원하는 위치에 TemplateField를 추가하고 원하는 이름과 사용할 값을 설정해 준다.

그럼 소스부분에(소스에서 수정해 주어야 한다.)

<asp:TemplateField HeaderText="테스트"></asp:TemplateField>

위와같은 템플릿필드 코드가 추가된다.(크기가 스타일같은건 알아서 설정해 주시고~~)


<!-- gridview.aspx 부분 -->
<asp:TemplateField HeaderText="테스트">
    <ItemTemplate>
        <%# ShowBuynow(Eval("buynow").ToString()) %>
    </ItemTemplate>
</asp:TemplateField>

여기에 <ItemTemplate>를 추가해주고 그안에서 C#코드를 사용해 주면 된다. 이 안에서는 gridview.aspx.cs에서 만들어 놓은 메서드를 호출할 수 있다. cs코드는 어차피 같은 파일이므로 바로 호출해주고 파라미터로 값을 넘겨주면 된다.

값은 Gridview의 연결된 데이터소스에서 받아올 수 있으며 Eval로 해당 필드값을 적어주면 값을 받아낼 수 있다.


// gridview.aspx.cs
protected string ShowBuynow(string buynow)
{
    if (int.Parse(buynow) != 0)
    {
        return "<img src='/images/buynow.gif'><br/>" + buynow;
    }
    else
    {
        return "";
    }
}

cs쪽에서는 그냥 메서드 만들듯이 만들어주면 된다. 파라미터 받아서 조건 검사한 다음에 그위치에 표시할 내용을 return해 준다. 어차피 html이 될것이므로 html코드로 만들어서 string으로 넘겨주면 그 위치에 뿌려지게 된다.

여기서는 간단한 조건이었지만 일단 그리드뷰 항목내에서 만들어 좋은 cs메서드를 사용할 수 있기 때문에 얼마든지 다양한 조건으로 표현해 주고 조건을 만들어낼 수 있을 듯 하다.
2007/07/18 01:14 2007/07/18 01:14