2008년 06월 19일
[WPF]쿼리 결과셋을 ListView와 바인딩하기
쿼리 결과셋을 ListView와 바인딩하게 되면 여러모로 편리합니다.
한번 바인딩이 되면 그 다음부터 걱정할건 쿼리문이외에는 없어지거든요.
어떤 쿼리문을 던져도 그 결과가 그대로 리스트뷰로 표현됩니다.
아래는 제가 이번 프로젝트에서 사용한 OleDb 연결을 이용한방법입니다.
쿼리 결과를 DataTable에 담아내는것이 핵심입니다.
이렇게 보면 간단하지만 이 방법을 성공시키는데 까지는... 상당한 고통이 있었습니다;;;(별짓을 다 했죠..)
// 쿼리 수행 후 결과를 DataTable에 담기
OleDbConnection dbConnection = new OleDbConnection(conString);
DataTable dt = new DataTable();
OleDbDataAdapter adapter = new OleDbDataAdapter();
try
{
adapter.SelectCommand = new OleDbCommand("SELECT * FROM TABLE", dbConnection);
adapter.Fill(dt); // 실제로 쿼리가 excute 되고, 결과는 dt에 저장이 된다.
}
catch (OleDbException e)
{
App.LogWrite(e.Message); // 에러메세지는 로그창에 출력(로그창은 Custom Window 입니다)
return null;
}
catch (Exception e)
{
App.LogWrite(e.Message);
return null;
}
// 컬럼이름
for (int i = 0; i < dt.Columns.Count; i++)
{
GridViewColumn col = new GridViewColumn();
col.DisplayMemberBinding = new Binding(dt.Columns[i].ColumnName);
this.grdview.Columns.Add(col); // grdview : ListView.View 에 대입된 GridView 오브젝트
}
// ListView에 DataTable을 바인딩
listview.DataContext = dt;
Binding bind = new Binding();
listview.SetBinding(ListView.ItemsSourceProperty, bind);
위 소스는 현재 프로젝트에 실제로 사용되는 코드입니다.
보강이 필요하다고 생각되시는 부분이 있으면 거침없는 댓글 부탁드립니다.
## 추가로 질문사항을 덧붙입니다. 아시는분은 댓글로 남겨주시면 감사하겠습니다.
1. 현재 WPF의 ListView 는 예전 ListView 콘트롤처럼 SubItem에 접근하는 방법이 없는거 같더군요.
이미 나온 결과셋을 ListView에 출력하기 전에(또는 후에) 약간의 조작을 하고 싶은데 어떻게 하면 좋은지 모르겠습니다.
(현재 저 위에 소스처럼 바인딩하면 ListView에 Index Number가 안나옵니다. 가장 원하는것은 ListView의 가장 왼쪽 컬럼에
Index를 출력할 열을 만들어 Row번호를 좀 볼수 있으면 좋겠는데요..)
2. ListView의 출력결과를 좀더 이쁘게 하기 위해 Row의 BackGround 를 홀수와 짝수 별로 컬러를 다르게 하고 싶은데
이것도 잘 안돼는군요.. @.@

한번 바인딩이 되면 그 다음부터 걱정할건 쿼리문이외에는 없어지거든요.
어떤 쿼리문을 던져도 그 결과가 그대로 리스트뷰로 표현됩니다.
아래는 제가 이번 프로젝트에서 사용한 OleDb 연결을 이용한방법입니다.
쿼리 결과를 DataTable에 담아내는것이 핵심입니다.
이렇게 보면 간단하지만 이 방법을 성공시키는데 까지는... 상당한 고통이 있었습니다;;;(별짓을 다 했죠..)
// 쿼리 수행 후 결과를 DataTable에 담기
OleDbConnection dbConnection = new OleDbConnection(conString);
DataTable dt = new DataTable();
OleDbDataAdapter adapter = new OleDbDataAdapter();
try
{
adapter.SelectCommand = new OleDbCommand("SELECT * FROM TABLE", dbConnection);
adapter.Fill(dt); // 실제로 쿼리가 excute 되고, 결과는 dt에 저장이 된다.
}
catch (OleDbException e)
{
App.LogWrite(e.Message); // 에러메세지는 로그창에 출력(로그창은 Custom Window 입니다)
return null;
}
catch (Exception e)
{
App.LogWrite(e.Message);
return null;
}
// 컬럼이름
for (int i = 0; i < dt.Columns.Count; i++)
{
GridViewColumn col = new GridViewColumn();
col.DisplayMemberBinding = new Binding(dt.Columns[i].ColumnName);
this.grdview.Columns.Add(col); // grdview : ListView.View 에 대입된 GridView 오브젝트
}
// ListView에 DataTable을 바인딩
listview.DataContext = dt;
Binding bind = new Binding();
listview.SetBinding(ListView.ItemsSourceProperty, bind);
위 소스는 현재 프로젝트에 실제로 사용되는 코드입니다.
보강이 필요하다고 생각되시는 부분이 있으면 거침없는 댓글 부탁드립니다.
## 추가로 질문사항을 덧붙입니다. 아시는분은 댓글로 남겨주시면 감사하겠습니다.
1. 현재 WPF의 ListView 는 예전 ListView 콘트롤처럼 SubItem에 접근하는 방법이 없는거 같더군요.
이미 나온 결과셋을 ListView에 출력하기 전에(또는 후에) 약간의 조작을 하고 싶은데 어떻게 하면 좋은지 모르겠습니다.
(현재 저 위에 소스처럼 바인딩하면 ListView에 Index Number가 안나옵니다. 가장 원하는것은 ListView의 가장 왼쪽 컬럼에
Index를 출력할 열을 만들어 Row번호를 좀 볼수 있으면 좋겠는데요..)
2. ListView의 출력결과를 좀더 이쁘게 하기 위해 Row의 BackGround 를 홀수와 짝수 별로 컬러를 다르게 하고 싶은데
이것도 잘 안돼는군요.. @.@

# by | 2008/06/19 14:01 | WPF | 트랙백 | 덧글(1)






☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]