Outsider's Dev Story: .NET/ASP.NET 2.0 카테고리 글 목록https://blog.outsider.ne.kr/Stay Hungry. Stay Foolish. Don't Be Satisfied.2024-03-15T10:11:08+09:00Textcube 1.10.7 : Tempo primoGridview에 DataSet을 DataBind()했을 때 페이징 하기Outsiderhttps://blog.outsider.ne.kr/332009-01-24T02:20:15+09:002007-08-12T00:22:18+09:00<p>이것저것 하다보면 GridView에 수동으로 다른 데이터를 바인딩 시켜야 할 때가 있다. 최근에 사용했을 때는 <a href="http://blog.outsider.ne.kr/27" target="_blank">비연결지향으로 DataSet을 얻어서 DataBind를 시켰는데</a> 이렇게 했을때 페이징이 제대로 되지 않는 문제점이 있었다.<br><br>GridView에 DataBide를 꼭 저렇게 안하고 아래에 적혀있듯이 Datasource자체를 바꿔주는 방법을 취할 수도 있고 그럴게 했을 경우는 큰 문제가 생기지 않을 것으로 예상된다.(테스트는 못해봤지만 일단 타입이 동일하므로...)<br><br>페이징을 하려면 별도로 비하인드 코드에서 처리르 해주어댜 한다. <br><br>해당 Gridview의 속성에서 PageIndexChanging를 생성해 주고 그 Behind코드에 다음 코드를 넣어주면 된다.</p><p><pre class="line-numbers"><code class="language-c#">
protected void AllItemGridView_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
AllItemGridView.PageIndex = e.NewPageIndex;
AllItemGridView.DataBind();
}
</code></pre><br>Gridview의 이름이 AllitemGridView이다. 내가 찾은 코드중에는 가장 간단한 코드이며 잘 작동한다. </p><p><strong><a href="https://blog.outsider.ne.kr/33?commentInput=true#entry33WriteComment">댓글 쓰기</a></strong></p>그리드뷰에 DataBind 시키기Outsiderhttps://blog.outsider.ne.kr/272009-01-24T02:03:19+09:002007-07-18T02:16:51+09:00그리드뷰는 기본적으로 SqlDataSource를 통해서 자동화를 통해서 SQL server나 XML이나 연결을 해 줄 수 있지만 내가 원하는대로 데이터를 바인드 시키기를 원할 때가 생겼다.<br><br>하려고 했던 것은 쇼핑몰사이트의 리스트를 GridView로 만들었는데 이 리스트가 기본적으로는 모든 물품의 리스트를 보여주고 있었다. 하지만 여러가지의 리스트가 필요했는데 예를 들면 카테고리를 눌렀을때는 카테고리의 물품만 보여줘야 했고 검색을 눌렀을때는 검색의 리스트를 보여주어야 했으며 판매자를 누르면 판매자의 리스트를 보여주어야 했다.<br><br>물론 가장 간단한 방법은 페이지를 여러개 만드는거다. 그리드뷰디자인을 하고 똑같은 페이지를 4개찍어낸 다음 데이터소스만 다르게 해놓고 그에 걸맞게 링크를 연결해 주면 된다.<br><br>하지만 이런 점은 나중에 수정상의 문제도 있을것 같고 비효율적인 듯이 보였다.<br><br>그다음에 생각한 것은 멀티뷰였다. 한파일에 멀티뷰를 넣어놓고 그 안에 뷰를 4개 만들어 놓고 날라온 파라미터 null체크해서 조건만들어서 그에 맞는 뷰를 Activate해주면 된다. 하지만 여기서도 그리드뷰는 4개나 필요했다...<br><br>그래서 고민끝에 그리드뷰는 하나만들어 놓고 DataBind를 시키기로 했다.<br><br><pre class="line-numbers"><code class="language-c#">
DataSet set = new DataSet();
SqlDataAdapter ad = new SqlDataAdapter(query, ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);
ad.Fill(set);
return set;
</code></pre><br>비연결지향으로 연결해서 DataSet으로 원하는 값의 데이터를 모두 받아왔다. 물론 query는 string으로 만은 쿼리문이다. 쿼리문 날리면 DataSet으로 반환해 주는 메서드를 따로 만든 것이다. (중간 메서드들이 있지만 그냥 머 핵심만 보면 되니까...)<br><br><pre class="line-numbers"><code class="language-c#">
GridView1.DataSourceID = "";
GridView1.DataSource = dao.GetDataSet();
GridView1.DataBind();
</code></pre><br>이걸 aspx.cs 부분에서 그리드뷰에 직접 바인드를 시킨것이다. DataSource부분에 받아온 DataSet을 할당하고 DataBind()를 시키면 된다.<br><br>DataSourceID는 GridView1에 자동화로 연결된 DataSouce가 있으면 aspx파일의 소스부분에 이에 대한 부분이 있어서 DataSourceID가 부여된 부분이 있어서 이렇게 바인드 시키면 충돌이 나서 에러가 나기 때문에 DataSourceID를 지워준 것이다.<br><br><br><br>일단 위처럼 해서 해결하기는 했는데 자세히는 잘 모르겠다. 물론 바인드하는데 여러가지 방법들이 있을 것이다. <br><br>처음에는 ArrayList로 받아서 넘겨주려고 했다. 제대로 잘 바인드되고 돌아가기는 했는데 먼가 이상했다. 3개가 떠야 하는데 2개만 뜬다던지 아니면 같은게 2개 뜬다든지 하는 문제가 있었다. 먼가 문제가 있는데 하는 생각에 만지다가...<br><br>DataReader를 직접 넘기면 된다고 해서 Reader를 받아서 바인드 시켰더니 이건 바인드는 잘 되는것 같은데 GridView에서 페이징을 사용하기로 해놨더니 "이 데이터는 페이징을 할 수 없다"는 에러메시지가 나왔다. 물론 페이징을 자동화 되어 있는거 말고 따로 만든다면 될지도 모르겠다.<br><br>그래서 결국은 비연결지향을 사용해서 DataSet으로...<br><br>역시나 자동화 되어 있는건 빠르게 할 수는 있는데 자동화와 수동화의 가운데서 엄청 해메고 있다.. ㅡ..ㅡ<br><br><br><br>
<div style="padding: 10px; background-color: rgb(208, 255, 157);"><font color="#000000">덧)))<br><br>더 좋은 방법이 있었다. ㅡ..ㅡ 머 서브쿼리같은거까지 쓰면 좀 그렇긴 하지만 그냥 그리드뷰만 하나만들어놓고 SqlDataSource만 여러개 만들어놓고 연결하면 된다. 그러면 굳이 C#코드에 메서드를 따로 안만들어도 된다. 그리고 소스에서 쿼리문도 고쳐줄수 있으니까.</font></div><br><pre class="line-numbers"><code class="language-c#">
GridView.DataSourceID = "";
GridView.DataSource = SqlDataSource1;
GridView.DataBind();
</code></pre><br><p><strong><a href="https://blog.outsider.ne.kr/27?commentInput=true#entry27WriteComment">댓글 쓰기</a></strong></p>그리드뷰에서 필드표현을 자유롭게 하기Outsiderhttps://blog.outsider.ne.kr/262009-01-24T02:01:03+09:002007-07-18T01:14:11+09:00그냥 책보고 그리드뷰따라하는 걸 벗어나서 간단한 웹사이트를 만들다 보니 단순히 거의 반자동으로 클릭 몇번으로만 만들 수 있는 그리드뷰는 사용상에 제약이 많았다.<br><br>그래서 이것저것 뒤져보았다. MS가 이렇게 멍청하게 만들지는 않았을테고(이게 머 위지윅도 아니고..) 먼가 있을텐데 하면서 찾아보다가 겨우 찾았다.<br><br>바로 TemplateField다.<br><br>일단 내가 하려고 했던건 그리드뷰에서 특정항목에서 이미지를 표현하고 싶었는데 값에 따라 다르게 하고 싶었다. 값이 없는건 안나타나고 값이 있을때만 이미지랑 값이 나타나도록....<br><br><div class="imageblock center" style="text-align: center; clear: both;"><img src="//blog.outsider.ne.kr/attach/1/1222244883.jpg" alt="사용자 삽입 이미지" height="412" width="653" /></div>
<p dir="ltr" style="margin-right: 0px;"><br>원하는 위치에 TemplateField를 추가하고 원하는 이름과 사용할 값을 설정해 준다.<br><br>그럼 소스부분에(소스에서 수정해 주어야 한다.) <br><br><font style="background-color: rgb(250, 255, 169);" color="#000000"><asp:TemplateField HeaderText="테스트"></asp:TemplateField></font><br><br>위와같은 템플릿필드 코드가 추가된다.(크기가 스타일같은건 알아서 설정해 주시고~~)</p><pre class="line-numbers"><code class="language-xml">
<!-- gridview.aspx 부분 -->
<asp:TemplateField HeaderText="테스트">
<ItemTemplate>
<%# ShowBuynow(Eval("buynow").ToString()) %>
</ItemTemplate>
</asp:TemplateField>
</code></pre><br><p dir="ltr" style="margin-right: 0px;">여기에 <ItemTemplate>를 추가해주고 그안에서 C#코드를 사용해 주면 된다. 이 안에서는 gridview.aspx.cs에서 만들어 놓은 메서드를 호출할 수 있다. cs코드는 어차피 같은 파일이므로 바로 호출해주고 파라미터로 값을 넘겨주면 된다.<br><br>값은 Gridview의 연결된 데이터소스에서 받아올 수 있으며 Eval로 해당 필드값을 적어주면 값을 받아낼 수 있다.</p><pre class="line-numbers"><code class="language-c#">
// gridview.aspx.cs
protected string ShowBuynow(string buynow)
{
if (int.Parse(buynow) != 0)
{
return "<img src='/images/buynow.gif'><br/>" + buynow;
}
else
{
return "";
}
}
</code></pre><br>cs쪽에서는 그냥 메서드 만들듯이 만들어주면 된다. 파라미터 받아서 조건 검사한 다음에 그위치에 표시할 내용을 return해 준다. 어차피 html이 될것이므로 html코드로 만들어서 string으로 넘겨주면 그 위치에 뿌려지게 된다.<br><br>여기서는 간단한 조건이었지만 일단 그리드뷰 항목내에서 만들어 좋은 cs메서드를 사용할 수 있기 때문에 얼마든지 다양한 조건으로 표현해 주고 조건을 만들어낼 수 있을 듯 하다.<p><strong><a href="https://blog.outsider.ne.kr/26?commentInput=true#entry26WriteComment">댓글 쓰기</a></strong></p>그리드뷰에서 마우스오버시 색 바꾸기Outsiderhttps://blog.outsider.ne.kr/252009-01-24T01:37:12+09:002007-07-18T00:43:34+09:00<p>ASP.NET 2.0에서는 그리드뷰(Grid View)라는 서버컨트롤을 이용해서 리스트를 쉽게 만들어 줄수 있는데 Row와 AlternatingRow를 이용해서 짝수줄의 색은 다르게 나타내어 줄 수 있다.<br><br>하지만 보통의 게시판들이 그렇듯이 Row에 마우스가 오버가 되었을 때 색이 바뀐다면 훨씬 직관적으로 보여줄 수 있다.<br><br>Grid View에서 RowDataBound 이벤트에 메서드를 만들어 준다.<br><br>여기선 그리드뷰의 이름이 AllItemGridView이다.</p>
<pre class="line-numbers"><code class="language-c#">
//그리드 뷰의 마우스 오버시 색 바꾸기
protected void AllItemGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
//Row가 DateRow일때만 적용하기 위해서
if (e.Row.RowType == DataControlRowType.DataRow)
{
//마우스 오버시에 변할 색
e.Row.Attributes["onMouseOver"] = "this.style.backgroundColor='#ffecf0';";
//Alternate와 Row의 색을 다르게 주었기 때문에
if (e.Row.RowState.ToString() == "Alternate")
{
//마우스 아웃시에는 다시 원래색으로 바꾸어 주기 위해서
e.Row.Attributes["onMouseOut"] = "this.style.backgroundColor='#E6E6E6';";
}
else //AlternateRow가 아닌경우에는 원래색으로
{
// Row의 색을 입력한다.
e.Row.Attributes["onMouseOut"] = "this.style.backgroundColor='';";
}
}
}
</code></pre><br><p>ASP.NET의 CS단에서는 색상코드가 약칭(aqua, red)은 먹지 않더라는;;;;;<br><br></p><p><strong><a href="https://blog.outsider.ne.kr/25?commentInput=true#entry25WriteComment">댓글 쓰기</a></strong></p>Visual Studio에서 만든 웹사이트 배포하기Outsiderhttps://blog.outsider.ne.kr/212007-07-22T00:44:07+09:002007-07-09T15:57:49+09:00Visual Studio 2005를 기준으로 설명한다.(왜냐하면 내가 2005를 쓰기 때문에.. 이전버전은 잘 모른다. 2005도 잘 모르지만... ㅡ..ㅡ)<br /><br />VS 2005는 기본적으로 aspx등의 페이지를 만든 후에 Ctrl + F5를 눌러서 빌드를 시키면 Web Developer Web Server라는게 뜨면서 가상으로 웹서버를 구성해 주기 때문에 IIS를 설치하지 않아도 페이지를 빌드해 볼 수 있다.<br /><br />다른 설정을 하지 않았을 경우 [내문서]안에 [Visual Studio 2005]라는 폴더 안에 프로젝트폴더속에 프로젝트 파일이 생기면 웹페이지들은 [WebSites]폴더안에 생성되서 가상웹서버가 이녀석을 실행시켜 주는 것인데 실제 웹페이지는 가상이 아닌 실서버에서 돌리기 위한 것이므로 개발후에는 배포를 해주어야 한다.<br /><br />VS 2005에서 배포를 하려면 2가지 방법이 있다. (물론 IIS는 설치되었다는 것을 가정하에 한다.)<br /><br />
<UL>
<LI><FONT color=#ff7635>웹 사이트 게시</FONT></LI>
<LI><FONT color=#ff7635>웹 사이트 복사</FONT></LI></UL>
<P>이렇게 2가지가 있다. 어느것을 선택해도 배포를 할 수 있지만 약간 둘의 차이점은 존재한다. 일단 배포하는 법을 보자...<br /><br /><br /><FONT color=#006699><STRONG><FONT style="BACKGROUND-COLOR: #ffdaed" size=4>웹사이트 게시</FONT></STRONG><br /><br /><div class="imageblock center" style="text-align: center; clear: both;"><img src="//blog.outsider.ne.kr/attach/1/1027013465.jpg" alt="사용자 삽입 이미지" height="170" width="276" /></div></FONT></P>웹사이트 게시는 솔루션 탐색기에서 해당프로젝트의 마우스 우클릭을 하면 [웹사이트 게시]메뉴가 있다.<br /><div class="imageblock center" style="text-align: center; clear: both;"><img src="//blog.outsider.ne.kr/attach/1/1252875734.jpg" alt="사용자 삽입 이미지" height="341" width="640" /></div><br />대상 위치에서 원하는 위치를 골라주면 된다. 오른쪽에 찾아보기를 하는 버튼을 누르면<br /><br /><div class="imageblock center" style="text-align: center; clear: both;"><img src="//blog.outsider.ne.kr/attach/1/1185192810.jpg" alt="사용자 삽입 이미지" height="418" width="652" /></div>보는 바와같이 웹서버의 루트디렉토리로 사용할 디렉토리를 파일시스템에서 직접 찾아가도 되고 IIS에서 해당 웹서버를 선택해 주어도 된다. 어느쪽을 해도 큰 차이는 없는 것 같다.(현 지식으로는.. ㅡ..ㅡ) 게시는 그 폴더에 있는 모든 파일을 지우고 게시한 파일들을 생성한다.<br /><br />설정을 해주면 웹사이트게시를 하면 해당위치로 출력이 된다. 이 때 웹사이트 게시는 미리컴파일(Precompilation)을 해주기 때문에 동적컴파일 시간을 줄요 초기 응답시간을 줄일 수 있다.<br /><br /><FONT color=#c1c1c1>※ 게시할 때 "미리 컴파일된 이 웹사이트를 업데이트를 할 수 있도록 허용"에 체크를 해주도록 하자. 그래야 수정해서 다시 게시할 수 있다. 체크가 없을 경우 aspx파일등으로 출력되지 않고 모두 dll파일로 컴파일 되어서 게시가 된다.</FONT><br /><br /><br /><br /><br /><FONT style="BACKGROUND-COLOR: #ffdaed" color=#006699 size=4><STRONG>웹사이트 복사</STRONG></FONT><br /><br /><div class="imageblock center" style="text-align: center; clear: both;"><img src="//blog.outsider.ne.kr/attach/1/1357586959.jpg" alt="사용자 삽입 이미지" height="424" width="298" /></div><br />웹사이트 복사는 중간쯤에 위치하고 있다. <br /><br /><div class="imageblock center" style="text-align: center; clear: both;"><img src="//blog.outsider.ne.kr/attach/1/1001455743.jpg" alt="사용자 삽입 이미지" height="629" width="693" /></div><br />웹사이트 복사는 게시에 비해서 좀 다른 기능들을 제공하고 있다. 기본적으로는 상위 연결에서 해당 IIS서버를 선택해서 연결하면 좌측에 현재 프로젝트의 파일들이 보이고 오른쪽엔 연결한 서버의 파일이 보이는데 내보내기를 하면 게시와 거의 동일하다. <br /><br />선택적으로 파일을 복사할 수 있으며 역으로 다시 가져올 수도 있으면 동기화버튼을 통해서 바뀐 파일들만 동기화 하는 것도 가능하다. <br /><br /><br /><br /><br />게시 혹은 복사가 끝나면 웹서버에 파일들이 위치하기 때문에 웹브라우져에서 해당 웹서버 주소로 접근해서 파일을 볼 수가 있다. 브라우저를 일일이 띄우는게 귀찮다면 프로젝트의 서버를 설정해 주면 된다.<br /><br /><div class="imageblock center" style="text-align: center; clear: both;"><img src="//blog.outsider.ne.kr/attach/1/1183004672.jpg" alt="사용자 삽입 이미지" height="580" width="277" /></div><br />솔루션 탐색기의 프로젝트에서 프로젝트의 속성페이지에 들어간다.<br /><br /><div class="imageblock center" style="text-align: center; clear: both;"><img src="//blog.outsider.ne.kr/attach/1/1393650377.jpg" alt="사용자 삽입 이미지" height="373" width="700" /></div><br />속성에서 [시작옵션]에 들어가면 중간에 서버설정에 대한 부분이 있다. 기본 웹서버가 Visual Studio에서 제공하는 가상 웹서버이다. 사용자 지정 서버를 선택해서 URL에 IIS로 사용하는 웹서버의 주소를 적어주면 된다.<br /><br />이렇게 설정해 줄 경우 VS 2005에서 Ctrl + F5를 눌러서 빌드를 하면 전처럼 가상서버가 뜨지 않고 빌드 후 지정서버의 URL로 브라우져가 뜨게 된다. (물론 이건 빌드만 하는 거기 때문에 변경내용을 적용하려면 그전에 게시든 복사든 배포를 해주어야 한다.)<br /><br /><br /><br /><FONT color=#8e8e8e>※ 빌드서버를 웹사이트로 지정했을 때 웹사이트 게시도 IIS로 웹서버를 선택해 주면 게시를 할 수 없다고 나타난다. 둘다 같은 곳으로 지정해서 사용하려면 웹사이트 게시는 파일시스템에서 해당 폴더를 선택해 주면 게시와 빌더를 동시에 사용할 수 있다.</FONT><p><strong><a href="https://blog.outsider.ne.kr/21?commentInput=true#entry21WriteComment">댓글 쓰기</a></strong></p>