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
    테네시왈츠
    항상 겸손하게 항상 새롭게 항상 진실하게

    ,

    Invoke 처리 부분 역시나 쓰레드 관계는 아직도 많이 헷갈리고 복잡한거 같다.

    델리게이트도 그렇고... 시간은 꽤 흐른거 같지만 내것이 되지 않는 이유는 무엇일까?

    아마도 정확하게 이해하지 못하고 그냥 그때그때 그 순간을 넘기기 위한 임시 방편으로만 생각하니 그러한 것 같다.

     

    간단히 2D 바코드 스캔시 왜 굳이 시리얼통신으로 해야하는지 아직도 많은 의구심이 든다?

    단지 포커스를 잃는다고 해서??? 내가 이전에 쓰는 키보드웨지 상황에선 전혀 그런걸로 걱정안해봤는데

    시리얼통신이 들어가니 시리얼포트도 신경써야하고 데이터수신 쓰레드 그리고 그와 연관된 컨트롤 데이터 처리부분의

    충돌부분도 신경써야 하고... 과연 시리얼타입이 정답일까? 난 아직까지 키보드웨지 스타일이 더 좋다고 자부한다.

     

    1. try
    2. {
    3. this.Invoke(new System.Windows.Forms.MethodInvoker(delegate()
    4. {
    5. // Input Source
    6. }));
    7. }
    8. catch (ObjectDisposedException ex)
    9. {
    10. System.Diagnostics.Debug.Write(ex.ToString());
    11. }
  •  


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

    ,

    개발을 할때 그리드를 컨트롤 한다는 것은 아주 기본적이면서도 각각의 그리드의 특성이 있기 때문에

    각 그리드의 컨트롤을 한다는 것이 얼마나 번거롭고 귀찮은 것인지 겪은 사람은 다 알것이라고 생각된다.

     

    나도 마찬가지로 현재까지 주로 많이 썼던것이 ms 기본 컨트롤인 datagridview를 비롯하여 farpoint의 spread(Sheet이긴 하지만), ultragrid등을

    써 보았는데 개인적으로는 개발세팅에 많은 불편함이 있는 상용컨트롤의 사용을 많이 자제 할려고 노력하고 있다.

     

    이번 프로젝트 하면서 처음으로 ultragrid를 사용해 보았는데 이 놈 또한 여간 성가신게 아니다.

    직접 그리드를 컨트롤 해서 하니 속도문제 그리고 부하문제도 많이 발생 하는것 같고... 아직 불안불안 하게 사용하고 있다만서도

    ultragrid는 dataset를 직접 핸들링 하면서 값을 가감 하면 속도가 엄청 빨라진다.

     

    체크박스는 콤보박스는 아직 못해봤는데 여전히 숙제로 남아 있다.

     

    dataset 핸들링 하는데 많은 경험이 없어 시험 삼아 해본 샘플 프로그램이다.

     

     

    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 WindowsFormsApplication4
    10. {
    11. public partial class Form1 : Form
    12. {
    13. private DataSet m_dsMain = null;
    14. private int iIDX = 0;
    15. public Form1()
    16. {
    17. InitializeComponent();
    18. }
    19. private void Form1_Load(object sender, EventArgs e)
    20. {
    21. // Main DataSet 설정
    22. m_dsMain = new DataSet();
    23. this.ultraGrid1.DataSource = m_dsMain;
    24. m_dsMain.Tables.Add("Main");
    25. m_dsMain.Tables["Main"].Columns.Add("SEQ");
    26. m_dsMain.Tables["Main"].Columns.Add("DATE");
    27. }
    28. private void button1_Click(object sender, EventArgs e)
    29. {
    30. DataRow dr = m_dsMain.Tables["Main"].NewRow();
    31. dr["SEQ"] = Convert.ToString(m_dsMain.Tables["Main"].Rows.Count + 1);
    32. dr["DATE"] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
    33. m_dsMain.Tables["Main"].Rows.Add(dr);
    34. }
    35. private void button2_Click(object sender, EventArgs e)
    36. {
    37. if (ultraGrid1.ActiveRow == null)
    38. {
    39. return;
    40. }
    41. m_dsMain.Tables["Main"].Rows.RemoveAt(ultraGrid1.ActiveRow.Index);
    42. for (int i = 0; i < m_dsMain.Tables["Main"].Rows.Count; i++)
    43. {
    44. m_dsMain.Tables["Main"].Rows[i]["SEQ"] = i + 1;
    45. }
    46. }
    47. private void button3_Click(object sender, EventArgs e)
    48. {
    49. m_dsMain.Clear();
    50. }
    51. }
    52. }

     


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

    ,

                IPHostEntry host = Dns.Resolve(Dns.GetHostName());
                string myip = host.AddressList[0].ToString();


    // 이거 예전에 등록했던거 같은데... 다른 블로그인가? ㅎㅎ

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

    ,

    http://goodhelper.egloos.com/1813667

    '020. Prigraming > 01. C#' 카테고리의 다른 글

    [C#] UltraGrid 추가, 삭제 그리고 Dataset 핸들링  (1) 2012.05.03
    [C#] 로컬 IP 구하기  (0) 2011.12.28
    [C#] string to byte  (0) 2011.07.29
    [C#] Hex To String  (0) 2011.07.14
    [C#] 프로세스가 살아있다.  (0) 2011.07.01

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

    ,