옮긴 회사가 델파이를 사용하다 보니 이전에 익숙했던 C#을 접할 기회가 거의 없다.

매번 느끼지만 각 프로그래밍언어를 옮기다 보면 변환 함수가 잘 떠오르지가 않아 애를 먹는 경우가 많다.


얼마전 프로그램에서 이번달 마지막 날짜를 구해야 하는 경우있어 델파이로 구현을 해 보다 문득 C#은 어떻게 구현을 할까 의문이 들었다. 그래서 오랫만에 C# 의 감을 느껴보고자 Visul Studio를 키고 동일한 내용의 값을 구현해 보았다.


우선 간단히 로직(?)을 설명하자면 

1. 지정한 날짜 기준에서 다음달 1일의 날짜를 구한다.

2. 다음달 1일 날짜에서 -1 해준다.

- 끝 -


곧바로 이번달 마지막 날짜를 구하는 함수가 C#에서 있는지 모르겠지만 현재로서는 그냥 이렇게 생각을 해 보았다.


1. 지정한 날짜 기준에서 다음달 1일의 날짜를 구한다.

            // "2016-03-01"

            string sFirstDay_of_NextMonth = DateTime.Now.AddMonths(1).ToString("yyyy-MM") + "-01";


2. 다음달 1일 날짜에서 -1 해준다.
            // "2016-02-29"
            string sLastDay_of_ThisMonth  = DateTime.Parse(sFirstDay_of_NextMonth).AddDays(-1).ToString("yyyy-MM-dd");

이런 내용이 되겠다.

자 그럼 응용해서 함수화 한다면 아래와 같이 구현할 수 있을것이다.

        private void Form1_Load(object sender, EventArgs e)
        {
            //// "2016-03-01"
            //string sFirstDay_of_NextMonth = DateTime.Now.AddMonths(1).ToString("yyyy-MM") + "-01";

            //// "2016-02-29"
            //string sLastDay_of_ThisMonth  = DateTime.Parse(sFirstDay_of_NextMonth).AddDays(-1).ToString("yyyy-MM-dd");

           
            string sTestData;
            // "2016-02-29"
            sTestData = GetLastDayOfThisMonth(DateTime.Now);
            // "2017-02-28"
            sTestData = GetLastDayOfThisMonth(DateTime.Parse("2017-02-12"));

        }
        
        /// <summary>
        /// 지정한 달의 마지막 날짜를 구함
        /// </summary>
        /// <param name="dtmDate"></param>
        /// <returns></returns>
        private string GetLastDayOfThisMonth(DateTime dtmDate)
        {
            string sFirstDay_of_NextMonth = dtmDate.AddMonths(1).ToString("yyyy-MM") + "-01";

            return DateTime.Parse(sFirstDay_of_NextMonth).AddDays(-1).ToString("yyyy-MM-dd");            
        }

2월이 들쑥날쑥 하니 예로 적당한 것 같다.

오랫만에 C#을 하니 그냥 마음이 편하다. 왠지 손에 맞는 연장을 든것처럼...
곧 C#으로 개발하는 날이 오겠지?




WRITTEN BY
테네시왈츠
항상 겸손하게 항상 새롭게 항상 진실하게

,


        private void grdData_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)

        {


            // RowPointPaint 이벤트핸들러

            // 행헤더 열영역에 행번호를 보여주기 위해 장방형으로 처리

            Rectangle rect = new Rectangle(e.RowBounds.Location.X,

                                e.RowBounds.Location.Y,

                                grdData.RowHeadersWidth - 4,

                                e.RowBounds.Height);


            // 위에서 생성된 장방형내에 행번호를 보여주고 폰트색상 및 배경을 설정

            TextRenderer.DrawText(e.Graphics,

                                (e.RowIndex + 1).ToString(),

                                grdData.RowHeadersDefaultCellStyle.Font,

                                rect,

                                grdData.RowHeadersDefaultCellStyle.ForeColor,

                                TextFormatFlags.VerticalCenter | TextFormatFlags.HorizontalCenter);

        }



WRITTEN BY
테네시왈츠
항상 겸손하게 항상 새롭게 항상 진실하게

,


        private void button1_Click(object sender, EventArgs e)
        {
            string sConn = "";

            sConn += "Data Source =                                                         ";
            sConn += "  (DESCRIPTION =                                                      ";
            sConn += "    (ADDRESS_LIST =                                                   ";
            sConn += "      (ADDRESS = (PROTOCOL = TCP)(HOST = xxx.xxx.xxx.xxx)(PORT = 1521)) ";
            sConn += "    )                                                                 ";
            sConn += "    (CONNECT_DATA =                                                   ";
            sConn += "      (SERVICE_NAME = AMES)                                           ";
            sConn += "    )                                                                 ";
            sConn += "  );User Id=mesmgr;Password=mesmgr;                                   ";

            string SQL = "SELECT SYSDATE FROM DUAL";

            OracleConnection conn = null;
            try
            {
                conn = new OracleConnection(sConn);
                conn.Open();
                OracleCommand comm = new OracleCommand(SQL, conn);
                comm.CommandType = CommandType.Text;

                OracleDataReader rs = comm.ExecuteReader();
                               
                while (rs.Read())
                {
                    MessageBox.Show("성공 : " + rs[0].ToString());
                }
                rs.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show("실패 : " + ex.Message);
            }
            finally
            {
                conn.Close();
            }


        }


WRITTEN BY
테네시왈츠
항상 겸손하게 항상 새롭게 항상 진실하게

,

테스트 해보아야 됨!


http://code.msdn.microsoft.com/office/How-to-Automate-control-23cd2a8f



// add PowerPoint namespace 

using PPt = Microsoft.Office.Interop.PowerPoint; 

using System.Runtime.InteropServices;



 Step4. Add Event Handle Codes in MainForm.cs file

 /// <summary> 

        /// Check whether PowerPoint is running  

        /// </summary> 

        /// <param name="sender"></param> 

        /// <param name="e"></param> 

        private void btnCheck_Click(object sender, EventArgs e) 

        { 

            try 

            { 

                // Get Running PowerPoint Application object 

                pptApplication = Marshal.GetActiveObject("PowerPoint.Application") as PPt.Application; 

 

                // Get PowerPoint application successfully, then set control button enable 

                this.btnFirst.Enabled = true; 

                this.btnNext.Enabled = true; 

                this.btnPrev.Enabled = true; 

                this.btnLast.Enabled = true; 

            } 

            catch 

            { 

                MessageBox.Show("Please Run PowerPoint Firstly", "Error", MessageBoxButtons.OKCancel, MessageBoxIcon.Error); 

            } 

            if (pptApplication != null) 

            { 

                // Get Presentation Object 

                presentation = pptApplication.ActivePresentation; 

                // Get Slide collection object 

                slides = presentation.Slides; 

                // Get Slide count 

                slidescount = slides.Count; 

                // Get current selected slide  

                try 

                { 

                    // Get selected slide object in normal view 

                    slide = slides[pptApplication.ActiveWindow.Selection.SlideRange.SlideNumber]; 

                } 

                catch 

                { 

                    // Get selected slide object in reading view 

                    slide = pptApplication.SlideShowWindows[1].View.Slide; 

                } 

            } 

        } 

 

        // Transform to First Page 

        private void btnFirst_Click(object sender, EventArgs e) 

        { 

            try 

            { 

                // Call Select method to select first slide in normal view 

                slides[1].Select(); 

                slide = slides[1]; 

            } 

            catch 

            { 

                // Transform to first page in reading view 

                pptApplication.SlideShowWindows[1].View.First(); 

                slide = pptApplication.SlideShowWindows[1].View.Slide; 

            } 

        } 

 

        // Transform to Last Page 

        private void btnLast_Click(object sender, EventArgs e) 

        { 

            try 

            { 

                slides[slidescount].Select(); 

                slide = slides[slidescount]; 

            } 

            catch 

            { 

                pptApplication.SlideShowWindows[1].View.Last(); 

                slide = pptApplication.SlideShowWindows[1].View.Slide; 

            } 

        } 

 

        // Transform to next page 

        private void btnNext_Click(object sender, EventArgs e) 

        { 

            slideIndex = slide.SlideIndex + 1; 

            if (slideIndex > slidescount) 

            { 

                MessageBox.Show("It is already last page"); 

            } 

            else 

            { 

                try 

                { 

                    slide = slides[slideIndex]; 

                    slides[slideIndex].Select(); 

                } 

                catch 

                { 

                    pptApplication.SlideShowWindows[1].View.Next(); 

                    slide = pptApplication.SlideShowWindows[1].View.Slide; 

                } 

            } 

        } 

 

        // Transform to Last page 

        private void btnPrev_Click(object sender, EventArgs e) 

        { 

            slideIndex = slide.SlideIndex - 1; 

            if (slideIndex >= 1) 

            { 

                try 

                { 

                    slide = slides[slideIndex]; 

                    slides[slideIndex].Select(); 

                } 

                catch 

                { 

                    pptApplication.SlideShowWindows[1].View.Previous(); 

                    slide = pptApplication.SlideShowWindows[1].View.Slide; 

                } 

            } 

            else 

            { 

                MessageBox.Show("It is already Fist Page"); 

            } 

        }


WRITTEN BY
테네시왈츠
항상 겸손하게 항상 새롭게 항상 진실하게

,


        private class ResultInfo

        {

            public ResultInfo(int resultId, Image image, string imageGraphics, string readString)

            {

                ResultId = resultId;

                Image = image;

                ImageGraphics = imageGraphics;

                ReadString = readString;

            }


            public int ResultId { get; set; }

            public Image Image { get; set; }

            public string ImageGraphics { get; set; }

            public string ReadString { get; set; }

        }

 

 

-- 몰라도 너무 모르는거 같음... ㅠㅠ


WRITTEN BY
테네시왈츠
항상 겸손하게 항상 새롭게 항상 진실하게

,

3rd Party 컨트롤 사용을 지양하는 나로서 데이터를 표시하는 DataGridView의 활용은 정말 중요하다.

사실 단순한 그리드 표현임에도 불구하고 무겁디 무거운 FarPoint, UltraGrid, C1Grid등의 사용은 마지못해 사용을 할 경우도 있지만

간혹 구역질 날 정도로 사용하기 싫은 경우가 대부분이다.


그래서 오늘은 현장에서 많이 쓰이는 작업자가 터치스크린에서 미세한 조정을 필요로 하며 Grid의 순서 위치를 변경해가며 컨트롤할 경우를

대비하여 만들어본 간단한 Row 이동처리 기능을 만들어 보았다.


먼저 결과화면 부터...






화면에 DataGridView, Button 두개가 전부인 Winform화면... 유추해 보면 알겠지만 Up버튼을 누르면 위로 Down버튼을 누르면 아래로 이동하는 기능이다.


소스는 아래와 같이...




using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;


namespace Ctrl_DataGridView

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }


        private void Form1_Load(object sender, EventArgs e)

        {

            SetGrid(dataGridView1);


            for (int i = 0; i < 30; i++)

            {

                int n = dataGridView1.Rows.Add();

                dataGridView1.Rows[n].Cells[00].Value = i.ToString();

                dataGridView1.Rows[n].Cells[01].Value = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");


                //dataGridView1.Rows.Insert(i, new string[] { i.ToString(), DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), "", "", "", "" });

            }


            lblMsg.Text = dataGridView1[0, 0].Value.ToString() + " / " + dataGridView1[1, 0].Value.ToString();

        }


        private void SetGrid(DataGridView grd)

        {


            // Grid Setting ////////////////////////////////////////////////////////////////////////////////////////////////

            grd.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;

            grd.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing;

            grd.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.DisableResizing;

            grd.SelectionMode = DataGridViewSelectionMode.FullRowSelect;

            grd.MultiSelect = false;

            grd.ReadOnly = true;

            //grd.RowHeadersVisible = false;

            grd.AllowUserToAddRows = false;



            //grd.RowTemplate.DefaultCellStyle.SelectionBackColor = Color.White;

            //grd.RowTemplate.DefaultCellStyle.SelectionForeColor = Color.Black;


            //grd.ColumnHeadersHeight = 32;

            //grd.RowTemplate.Height = 40;


            // mPLC.StartReadWord

            grd.ColumnCount = 6;


            string CML00 = "00";

            string CML01 = "01";

            string CML02 = "02";

            string CML03 = "03";

            string CML04 = "04";

            string CML05 = "05";


            grd.Columns[00].Name = CML00;

            grd.Columns[01].Name = CML01;

            grd.Columns[02].Name = CML02;

            grd.Columns[03].Name = CML03;

            grd.Columns[04].Name = CML04;

            grd.Columns[05].Name = CML05;


            for (int i = 0; i < grd.Columns.Count; i++)

            {

                grd.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable;

                grd.Columns[i].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;

                grd.Columns[i].Width = 65;

            }

            ////////////////////////////////////////////////////////////////////////////////////////////////////////////////


        }


        private void btnUp_Click(object sender, EventArgs e)

        {

            int iSelRow = 0;


            for (int i = 0; i < dataGridView1.SelectedCells.Count; i++)

            {

                iSelRow = dataGridView1.SelectedCells[i].RowIndex;


                if (iSelRow == 0) return;


                dataGridView1[0, iSelRow - 1].Selected = true;

                

                lblMsg.Text = dataGridView1[0, iSelRow - 1].Value.ToString() + " / " + dataGridView1[1, iSelRow - 1].Value.ToString();


                break;

            }


        }


        private void btnDown_Click(object sender, EventArgs e)

        {


            int iSelRow = 0;

            for (int i = 0; i < dataGridView1.SelectedCells.Count; i++)

            {

                iSelRow = dataGridView1.SelectedCells[i].RowIndex;


                if (iSelRow == dataGridView1.Rows.Count - 1) return;


                dataGridView1[0, iSelRow + 1].Selected = true;


                lblMsg.Text = dataGridView1[0, iSelRow + 1].Value.ToString() + " / " + dataGridView1[1, iSelRow + 1].Value.ToString();


                break;

            }

        }


    }

}








WRITTEN BY
테네시왈츠
항상 겸손하게 항상 새롭게 항상 진실하게

,

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;


using System.Xml;


namespace _CS__xml

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }


        private void Form1_Load(object sender, EventArgs e)

        {

            label1.Text = "";


            string url = "sample.xml";


            XmlDocument xml = new XmlDocument();


            xml.Load(url);


            XmlNodeList xnList = xml.SelectNodes("/Names/Name");


            for (int i = 0; i < xnList[0].ChildNodes.Count; i++)

            {

                string child_node_nm = xnList[0].ChildNodes[i].Name;

            }


            foreach (XmlNode xn in xnList)

            {


                for (int i = 0; i < xn.ChildNodes.Count; i++)

                {

                    string child_node_nm = xn.ChildNodes[i].Name;

                }


                string nodeNM = xn.FirstChild.Name;

                string firstName = xn["FirstName"].InnerText;

                string lastName = xn["LastName"].InnerText;


                label1.Text += string.Format("Node : {0} > Name: {1} . {2} \r\n", nodeNM, firstName, lastName);

            }



        }

    }

}




---------------------------------------------------------------------------------------------------------------
<?xml version="1.0" encoding="EUC-KR" standalone="yes" ?>
<Names>
  <Name>
    <FirstName>John</FirstName>
    <LastName>Smith</LastName>
  </Name>
  <Name>
    <FirstName>James</FirstName>
    <LastName>White</LastName>
  </Name>
</Names>



<참고>
http://www.csharp-examples.net/xml-nodes-by-name/


WRITTEN BY
테네시왈츠
항상 겸손하게 항상 새롭게 항상 진실하게

,

dataGridView 만지작 거리면서 내부적으로 copy & paste가 안되는것을 보고 바로 구글링에 들어갔다.

다행히 착한 소스가 보여 바로 들고왔다.

 

디자인은 대략이렇고 구성돼 있고

 

 

소스는 아래와 같다.

 

 

 

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. namespace CopyPasteInGrid
  10. {
  11. public partial class Form1 : Form
  12. {
  13. public Form1()
  14. {
  15. InitializeComponent();
  16. PopulateDataGridView();
  17. }
  18. public void PopulateDataGridView()
  19. {
  20. dataGridView1.ColumnCount = 6;
  21. dataGridView1.Columns[0].Name = "C0";
  22. dataGridView1.Columns[1].Name = "C1";
  23. dataGridView1.Columns[2].Name = "C2";
  24. dataGridView1.Columns[3].Name = "C3";
  25. dataGridView1.Columns[4].Name = "C4";
  26. dataGridView1.Columns[5].Name = "C5";
  27. dataGridView1.Columns[0].HeaderText = "C0";
  28. dataGridView1.Columns[1].HeaderText = "C1";
  29. dataGridView1.Columns[2].HeaderText = "C2";
  30. dataGridView1.Columns[3].HeaderText = "C3";
  31. dataGridView1.Columns[4].HeaderText = "C4";
  32. dataGridView1.Columns[5].HeaderText = "C5";
  33. dataGridView1.Columns[0].Width = 40;
  34. dataGridView1.Columns[1].Width = 40;
  35. dataGridView1.Columns[2].Width = 40;
  36. dataGridView1.Columns[3].Width = 40;
  37. dataGridView1.Columns[4].Width = 40;
  38. dataGridView1.Columns[5].Width = 40;
  39. dataGridView1.Rows.Add(new string[] { "A1", "B1", "C1", "D1", "E1", "F1" });
  40. dataGridView1.Rows.Add(new string[] { "A2", "B2", "C2", "D2", "E2", "F2" });
  41. dataGridView1.Rows.Add(new string[] { "A3", "B3", "C3", "D3", "E3", "F3" });
  42. dataGridView1.Rows.Add(new string[] { "A4", "B4", "C4", "D4", "E4", "F4" });
  43. dataGridView1.Rows.Add(new string[] { "A5", "B5", "C5", "D5", "E5", "F5" });
  44. dataGridView1.Rows.Add(new string[] { "A6", "B6", "C6", "D6", "E6", "F6" });
  45. dataGridView1.Rows.Add(new string[] { "A7", "B7", "C7", "D7", "E7", "F7" });
  46. dataGridView1.AutoResizeColumns();
  47. }
  48. private void dataGridView1_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
  49. {
  50. if (dataGridView1.SelectedCells.Count > 0)
  51. dataGridView1.ContextMenuStrip = contextMenuStrip1;
  52. }
  53. private void cutToolStripMenuItem_Click(object sender, EventArgs e)
  54. {
  55. //Copy to clipboard
  56. CopyToClipboard();
  57. //Clear selected cells
  58. foreach (DataGridViewCell dgvCell in dataGridView1.SelectedCells)
  59. dgvCell.Value = string.Empty;
  60. }
  61. private void copyToolStripMenuItem_Click(object sender, EventArgs e)
  62. {
  63. CopyToClipboard();
  64. }
  65. private void pasteToolStripMenuItem_Click(object sender, EventArgs e)
  66. {
  67. //Perform paste Operation
  68. PasteClipboardValue();
  69. }
  70. private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
  71. {
  72. try
  73. {
  74. if (e.Modifiers == Keys.Control)
  75. {
  76. switch (e.KeyCode)
  77. {
  78. case Keys.C:
  79. CopyToClipboard();
  80. break;
  81. case Keys.V:
  82. PasteClipboardValue();
  83. break;
  84. }
  85. }
  86. }
  87. catch (Exception ex)
  88. {
  89. MessageBox.Show("Copy/paste operation failed. "+ex.Message, "Copy/Paste", MessageBoxButtons.OK, MessageBoxIcon.Warning);
  90. }
  91. }
  92. private void CopyToClipboard()
  93. {
  94. //Copy to clipboard
  95. DataObject dataObj = dataGridView1.GetClipboardContent();
  96. if (dataObj != null)
  97. Clipboard.SetDataObject(dataObj);
  98. }
  99. private void PasteClipboardValue()
  100. {
  101. //Show Error if no cell is selected
  102. if (dataGridView1.SelectedCells.Count == 0)
  103. {
  104. MessageBox.Show("Please select a cell", "Paste", MessageBoxButtons.OK, MessageBoxIcon.Warning);
  105. return;
  106. }
  107. //Get the satring Cell
  108. DataGridViewCell startCell = GetStartCell(dataGridView1);
  109. //Get the clipboard value in a dictionary
  110. Dictionary<int, Dictionary<int, string>> cbValue = ClipBoardValues(Clipboard.GetText());
  111. int iRowIndex = startCell.RowIndex;
  112. foreach (int rowKey in cbValue.Keys)
  113. {
  114. int iColIndex = startCell.ColumnIndex;
  115. foreach (int cellKey in cbValue[rowKey].Keys)
  116. {
  117. //Check if the index is with in the limit
  118. if (iColIndex <= dataGridView1.Columns.Count - 1 && iRowIndex <= dataGridView1.Rows.Count - 1)
  119. {
  120. DataGridViewCell cell = dataGridView1[iColIndex, iRowIndex];
  121. //Copy to selected cells if 'chkPasteToSelectedCells' is checked
  122. if ((chkPasteToSelectedCells.Checked && cell.Selected) ||
  123. (!chkPasteToSelectedCells.Checked))
  124. cell.Value = cbValue[rowKey][cellKey];
  125. }
  126. iColIndex++;
  127. }
  128. iRowIndex++;
  129. }
  130. }
  131. private DataGridViewCell GetStartCell(DataGridView dgView)
  132. {
  133. //get the smallest row,column index
  134. if (dgView.SelectedCells.Count == 0)
  135. return null;
  136. int rowIndex = dgView.Rows.Count - 1;
  137. int colIndex = dgView.Columns.Count - 1;
  138. foreach (DataGridViewCell dgvCell in dgView.SelectedCells)
  139. {
  140. if (dgvCell.RowIndex < rowIndex)
  141. rowIndex = dgvCell.RowIndex;
  142. if (dgvCell.ColumnIndex < colIndex)
  143. colIndex = dgvCell.ColumnIndex;
  144. }
  145. return dgView[colIndex, rowIndex];
  146. }
  147. private Dictionary<int, Dictionary<int, string>> ClipBoardValues(string clipboardValue)
  148. {
  149. Dictionary<int, Dictionary<int, string>> copyValues = new Dictionary<int, Dictionary<int, string>>();
  150. String[] lines = clipboardValue.Split('\n');
  151. for (int i = 0; i <= lines.Length - 1; i++)
  152. {
  153. copyValues[i] = new Dictionary<int, string>();
  154. String[] lineContent = lines[i].Split('\t');
  155. //if an empty cell value copied, then set the dictionay with an empty string
  156. //else Set value to dictionary
  157. if (lineContent.Length == 0)
  158. copyValues[i][0] = string.Empty;
  159. else
  160. {
  161. for (int j = 0; j <= lineContent.Length - 1; j++)
  162. copyValues[i][j] = lineContent[j];
  163. }
  164. }
  165. return copyValues;
  166. }
  167. }
  168. }
  •  

     

     

     

    [출처] http://www.codeproject.com/Articles/208281/Copy-Paste-in-Datagridview-Control?rp=/KB/TipsnTricks/CopyPasteInDatagridview/SourceCode.zip

     

     

    - 솔루션 소스 파일 첨부 -

     

    CopyPasteInGrid.zip

     


    WRITTEN BY
    테네시왈츠
    항상 겸손하게 항상 새롭게 항상 진실하게

    ,

    [Link] http://csharp.net-informations.com/datagridview/csharp-datagridview-add-column.htm



    C# DataGridView - Related Contents


    WRITTEN BY
    테네시왈츠
    항상 겸손하게 항상 새롭게 항상 진실하게

    ,

    처음에는 m_dsMain.Tables[0].Rows 수만큼 loop 처리해서 해야 하는 줄 알았는데 그러니...

    컬렉션이 변경되었다며 에러가 나는구나.

    1. foreach (DataRow dr in m_dsMain.Tables[0].Select())
    2. {
    3. if (dr["SEQ"].ToString() == "3")
    4. {
    5. m_dsMain.Tables[0].Rows.Remove(dr);
    6. }
    7. }
  •  

     

    Select() 메소드는 Row를 다이내믹하게 불러와 처리하게 되므로 문제가 없다고 한다.

     

     

     

     

    <참조> http://blog.naver.com/PostView.nhn?blogId=zehny&logNo=140098866676

     

     

     

    추가는 이렇게

    1. DataRow dr = dsGrid.Tables[0].NewRow();
    2. dr["SEQ"] = Convert.ToString(dsGrid.Tables[0].Rows.Count + 1);
    3. dr["DATE"] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
    4. dr["TMNO"] = sTM_NO;
    5. dr["ITEM"] = sItem;
    6. dsGrid.Tables[0].Rows.Add(dr);

    삭제할때 정확한 index를 알고 있다면

     

    1. m_dsMain.Tables["Main"].Rows.RemoveAt(gridMain.ActiveRow.Index);
  •  

    이렇게 사용해도 된다.

     

     

    첨에 DataSet 핸들링이 어려워 너무 고생했다. 물론 아직 DataSet은 내 손에 익진 않지만 dataset을 알고자 할때

    DataTabe, DataRow를 알면 GameSet이 아닌가 하는 생각이 든다.

     


    WRITTEN BY
    테네시왈츠
    항상 겸손하게 항상 새롭게 항상 진실하게

    ,