본문 바로가기
알고 있으면 유용한 것들

C# 데이터테이블을 String 문자열로 만드는 코드

by 긍정왕수전노 2021. 8. 19.
반응형

취미로 만드는 키움증권 OpenAPI로 C# 주식자동검색 프로그램에서 사용하는 코드인데 다른 분들께도 유용할 것 같아서 공유 드립니다.

컨셉은 간단합니다. 

데이터 테이블, 데이터 그리드뷰의 셀 내용들을 약간 어색하지만 텍스트 문자열 (string)으로 변환해주는 코드입니다.

예를 들어 보여드리면~

이런 데이터그리드뷰 (데이터 소스로 데이터 테이블을 맵핑했음)를

이렇게 텍스트로 바꿔주는 메소드입니다.

 

아래 코드 그대로 뚝 떠다가 쓰시면 됩니다.

        #region   DataTable을 String으로 변환
        public static string DataTable2String(DataTable dataTable)
        {
            StringBuilder sb = new StringBuilder();
            if (dataTable != null)
            {
                string seperator = " | ";

                #region get min length for columns
                System.Collections.Hashtable hash = new System.Collections.Hashtable();
                foreach (DataColumn col in dataTable.Columns)
                    hash[col.ColumnName] = col.ColumnName.Length;
                foreach (DataRow row in dataTable.Rows)
                {
                    if (row[0] != DBNull.Value)
                    {
                        for (int i = 0; i < row.ItemArray.Length; i++)
                            if (row[i] != DBNull.Value)
                                if (((string)row[i]).Length > (int)hash[dataTable.Columns[i].ColumnName])
                                    hash[dataTable.Columns[i].ColumnName] = ((string)row[i]).Length;
                    }
                }
                int rowLength = (hash.Values.Count + 1) * seperator.Length;
                foreach (object o in hash.Values)
                    rowLength += (int)o;
                #endregion get min length for columns

                sb.Append(new string('=', 10));

                if (!string.IsNullOrEmpty(dataTable.TableName))
                    sb.Append(String.Format(" {0} ", dataTable.TableName));
                else
                    sb.Append(" DataTable ");

                sb.AppendLine(new string('=', 10));

                #region write values
                foreach (DataColumn col in dataTable.Columns)
                    sb.Append(seperator + String.Format("{0,-" + hash[col.ColumnName] + "}", col.ColumnName));
                sb.AppendLine(seperator);
                sb.AppendLine(new string('-', 22 + dataTable.TableName.Length));
                foreach (DataRow row in dataTable.Rows)
                {
                    if (row[0] != DBNull.Value)
                    {
                        for (int i = 0; i < row.ItemArray.Length; i++)
                        {
                            object cellVal = row[i].ToString();
                            if (cellVal.ToString() == "")
                            {
                                for (int j = 0; j < int.Parse(hash[dataTable.Columns[i].ColumnName].ToString()); j++)
                                {
                                    cellVal += "~ ";
                                }
                            }

                            sb.Append(seperator + String.Format("{0," + hash[dataTable.Columns[i].ColumnName] + "}", cellVal));
                            if (i == row.ItemArray.Length - 1)
                                sb.AppendLine(seperator);
                        }
                    }
                }
                #endregion write values

                sb.AppendLine(new string('=', 22 + dataTable.TableName.Length));
            }
            else
                sb.AppendLine("===== DataTable is NULL =====");

            return sb.ToString();
        }
        #endregion
반응형