2015년 3월 2일 월요일

C# WinFrom 데이터그리드뷰(DataGridView) 데이터 바인딩.

디비의 데이터를 보여주기 위해 DataGridView 에 데이터를 바인딩 한다.



보통은 이렇게 폼에 DataGridView 를 놓고, 클릭 이벤트를 만들어서...




private void btnSearch_Click(object sender, EventArgs e)
{
 SqlManager sqlManager = new SqlManager();
 sqlManager.open();

 SqlParameter[] sqlParams = new SqlParameter[2];
 sqlParams[0] = new SqlParameter("@START_INDEX", SqlDbType.Int);
 sqlParams[0].Value = "1";
 sqlParams[1] = new SqlParameter("@PAGE_SIZE", SqlDbType.Int);
 sqlParams[1].Value = "10";

 string strSql = string.Empty;
 strSql = "select * from T_MEMBER_LIST";

 DataSet dataSet = sqlManager.ExecuteDataSet(
  CommandType.Text,
  strSql,
  sqlParams
 );

 grvMemberList.DataSource = dataSet.Tables[0];
 sqlManager.Dispose();
}



이렇게 데이터를 바인딩 하면 된다.... 고 대부분의 책에는 설명이 되어 있다.
틀린말이야 아니지만, 이렇게 하면...




이렇게 조회한 값이 다 나와 버리는데다가, 헤더도 DB 의 명칭이 그대로 나와버려서, 일반적으로는 이렇게 쓰기는 좀 어렵다.


그래서 "grvMemberList.DataSource = dataSet.Tables[0];" 이런 식으로 통으로 바인딩 시키기 보다는, 좀 귀찮지만 일일히 하나식 바인딩 시켜주는 일이 많은데...








private void btnSearch_Click(object sender, EventArgs e)
{
 SqlManager sqlManager = new SqlManager();
 sqlManager.open();

 SqlParameter[] sqlParams = new SqlParameter[2];
 sqlParams[0] = new SqlParameter("@START_INDEX", SqlDbType.Int);
 sqlParams[0].Value = "1";
 sqlParams[1] = new SqlParameter("@PAGE_SIZE", SqlDbType.Int);
 sqlParams[1].Value = "10";

 string strSql = string.Empty;
 strSql = "select * from T_MEMBER_LIST";

 DataSet dataSet = sqlManager.ExecuteDataSet(
  CommandType.Text,
  strSql,
  sqlParams
 );

 grvMemberList.Columns.Clear();
 grvMemberList.Columns.Add("strLoginName", "이 름");

 foreach (DataGridViewColumn col in grvMemberList.Columns)
 {
  col.SortMode = DataGridViewColumnSortMode.NotSortable;
  col.HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter;
  col.HeaderCell.Style.Font = new Font("Arial", 12F, FontStyle.Bold, GraphicsUnit.Pixel);
 }

 foreach (DataRow r in dataSet.Tables[0].Rows)
 {
  int n = grvMemberList.Rows.Add();
  grvMemberList.Rows[n].Cells[0].Value = r["strLoginName"].ToString();
 }

 sqlManager.Dispose();

}


뭐... 별건 아니고, 헤더를 쓸것만 일일이 지정해 주고, 데이터 부분도 수동으로 일일이 지정해 주는것일 뿐.
이렇게 함으로 해서 헤더도 원하는 디자인으로 설정할 수 있고, 데이터 부분도 세세하게 컨트롤이 가능하다.


"grvMemberList.DataSource" 를 바인딩 시킨다고 해서 안되는것은 아니지만, 차라리 이게 더 속편하다.




이렇게 조회한 값에서 선별적으로 표시할 수 있다.

참고로 "col.HeaderCell.Style.Alignment" 를 지정해서 헤더 부분을 가운데 정렬 할 수가 있는데, "col.SortMode" 가 "NotSortable" 가 아니면 정확히 가운데 정렬이 되지 않으므로 주의 해야 한다.