728x90

변수(Variable) : 메모리상의 임시 데이터 공간

// 1. 변수 선언    --> 나 _ (바)다. 다.

// 2. 변수 초기화(할당)  --> 미,

// 3. 변수 참조(사용)

// 4. 변수의 데이터 타입을 반환 : GetType()  (필요시)


다.

변수 타입 : Value 타입, Reference 타입

Value 타입으로 변수를 선언하면 자동으로 메모리가 생성된다.

Reference 타입으로 변수를 선언하면 참조변수에 해당하는 메모리만 생성된다.

실제 메모리는 new 연산자를 이용해서 생성해주어야 한다.


문(if, switch) , 문(for, foreach, while), 문(break, continue) 다.

C#의 조건문/반복문(if, for, while)의 조건식은 반드시 논리형(bool)이어야 한다.

while 문은 조건식에 의해서만 반복 수행이 결정된다.

다.




두번 탭을 누르면 자동으로 아래처럼 IF문 형다.



이제 IF문 형태에 실제 코드를 작성하면 된다.




이제 FOR 문에 대해서도 for 을 입력하고 탭을 2번 누르면 for 문 형태가 자동으로 만들어진다.



지역변수 i 가 자동으로 선언되고 수정할 부분이 어디인지 화면에 보여준다.

그 부분을 수정하고 실제 수행할 코드를 완성시키면 된다.


for 문은 초기화, 조건식, Step 3가지로 나뉘어진다.

- 정해진 횟수만큼 반복적으로 수행할 때 for문을 사용한다.

- 한계나 범위가 주어져 있을 때는 for문을 사용한다.

- 특정 조건에만 반복 수행할 때에는 while 문을 사용한다.



do while 문은 최소한 1번은 실행된다.

do 를 입력하고 탭을 두번 누르면 do while 문의 형태가 자동으로 만들어진다.




while



수, 다.

이 사항은 경험으로 배우게 되는 거라 그런지 책에 언급되어 있는 경우가 거의 없다. 아니면 내가 무심코 지나쳐 버렸거나...


'C# > 문법 및 기능' 카테고리의 다른 글

C# 문자열 분리 Split  (0) 2015.10.09
C# 파일 경로, 파일명, 확장자, 현재 경로  (0) 2015.09.29
C# enum  (0) 2015.09.23
C# 과 VB 문법 차이  (0) 2015.09.22
C# Controls  (0) 2015.09.18
블로그 이미지

Link2Me

,

C# 인코딩

C#/기능 활용 2015. 9. 24. 00:30
728x90

Network Stream을 제외하고 모든 Stream 은 System.IO 네임스페이스에 정의되어 있다.

string 문자열을 C#의 Char[] 배열로 변경하는 것은 String 클래스의 ToCharArray() 메서드를 사용한다.


byte[]를 직접 string으로 변경하려면 우선 byte[] 가 어떤 Charset을 가지고 인코딩(ASCII, Unicode, UTF8 등) 되었는지 알아야 한다.


StreamReader 는 특정 인코딩으로 입력된 문자를 읽도록 설계된 반면 Stream 클래스는 입력 및 출력된 바이트를 읽도록 설계되었다.


3일간 발생하는 에러를 해결하지 못하다가 무료 Hex Viewer 를 설치해서 파일 인코딩 형식이 어떻게 되는지 파악하고서야 문제를 해결할 수 있었다.

http://mh-nexus.de/en/downloads.php?product=HxD

에서 다운로드 받을 수 있다.


HEXViewer.zip



Subtitle Edit 자막툴에서 제공하는 인코딩 모드를 변경해본 다음에 어떻게 변경되는지 일일이 확인을 해봤다.

그리고 EditPlus 로도 일일이 인코딩모드를 변경해서 확인을 해봤다.

CSV 파일로 내보내기를 한 파일도 조사를 해봤다. 다른 점이 발견되었다.










'C# > 기능 활용' 카테고리의 다른 글

C# 프로그램 사용기한 체크  (0) 2015.10.23
C# Get Mac Address  (0) 2015.10.12
C# Get IP Address (사설 IP, 공인 IP)  (0) 2015.10.11
문자열 암호화 - RSA, MD5, DES  (0) 2015.08.07
C# OS 버전 및 플랫폼 확인 방법  (0) 2015.08.06
블로그 이미지

Link2Me

,

C# enum

C#/문법 및 기능 2015. 9. 23. 00:30
728x90

enum은 열거형 상수(constant)를 표현하기 위한 것으로 프로그램을 읽기 쉽게 해준다.
enum문은 클래스 안이나 네임스페이스내에서만 선언될 수 있다.
enum의 각 요소는 첫번째 요소가 0, 두번째가 1 등으로 1씩 증가된 값들을 할당받는다.
개발자가 임의로 의미있는 번호를 지정해 줄 수도 있다.


enum <enum_name>
{
    enumeration list
}

enum Days
// 순서는 상관없고 같은 값을 가지는 이름이 여러개 있어도 괜찮다.

// 만약 따로 값을 지정하지 않으면, 첫번째는 0, 두번째는 1, 세번째는 2 식으로 자동 지정된다.
    Sunday = 1,
    Monday = 2,
    Tuesday = 3,
    Wednesday = 4,
    Thursday = 5,
    Friday = 6,
    Saturday = 7
}

//get value
int day = (int)Days.TuesDay;  // int 로 형변환

//cast to enum
Days day = (Days)3;

MyEnum myenum = (MyEnum)Enum.ToObject(typeof(MyEnum) , intvalue);
Days day = (Days)Enum.ToObject(typeof(Days), 3);



블로그 이미지

Link2Me

,
728x90

출처 : http://blog.daum.net/pepmanager/7866894


VB             C#

UBound()     = yourArray.GetUpperBound(0) or yourArray.Length for one-dimesional arrays
LBound()     = yourArray.GetLowerBound(0)
IsNothing()   = Object.ReferenceEquals(obj,null)
Chr()           = Convert.ToChar()
Len()          = "string".Length
UCase()      = "string".ToUpper()
LCase()      = "string".ToLower()
Left()          = "string".Substring(0, length)
Right()        = "string".Substring("string".Length - desiredLength)
RTrim()       = "string".TrimEnd()
LTrim()        = "string".TrimStart()
Trim()          = "string".Trim()
Mid()        = "string".Substring(start, length)
Replace()    = "string".Replace()
Split()      = "string".Split()
Join()       = String.Join()
MsgBox()     = MessageBox.Show()
IIF()        = (boolean_condition ? "true" : "false")



'C# > 문법 및 기능' 카테고리의 다른 글

C# 변수 선언, 제어문과 자동완성 기능  (2) 2015.09.25
C# enum  (0) 2015.09.23
C# Controls  (0) 2015.09.18
C# TextBox 입력값(한글, 영문, 숫자) 검사, 엔터키 입력, readonly  (0) 2015.09.11
C# 콤보박스(comboBox)  (0) 2015.09.09
블로그 이미지

Link2Me

,
728x90

Panel 이나 Tabpage 로 Layout 을 구성하였는데, 다른 폼을 Panel / TabPage 안에 띄우고 싶을 때 처리하는 방법을 구글검색과 직접 테스트를 하면서 분석하여 알게 된 것을 적어둔다.


아래 화면을 보면 tabPage4 에 원래 보이는 화면과 아래에는 달력폼이 있는 화면을 가져와서 보여주고 있다.




어떻게 하면 새로운 Form2 의 화면을 tabPage4 에 보이도록 할 수 있을까?


https://msdn.microsoft.com/ko-kr/library/system.windows.forms.control%28v=vs.110%29.aspx

에 Control 클래스의 정의를 보면 시각적으로 표시되는 구성 요소인 컨트롤의 기본 클래스를 정의한다고 설명되어 있다.

http://www.csharpstudy.com/Threads/uithread.aspx 에 보면 WinForm의 UI 컨트롤들은 Control 클래스로부터 파생된 클래스들 이라고 되어 있다.


Designer.cs 파일을 열어서 tabPag4 부분을 찾아보면 ...tabPage4.Controls.Add 에 splitContainer4 를 추가한 것을 알 수 있다. 물론 마우스 몇번 까딱까딱하면 자동으로 만들어진다. 만들어진 내용이 바로 여기에 적혀 있다.

//
// tabPage4
//
this.tabPage4.Controls.Add(this.splitContainer4);
this.tabPage4.Location = new System.Drawing.Point(4, 22);
this.tabPage4.Name = "tabPage4";
this.tabPage4.Padding = new System.Windows.Forms.Padding(3);
this.tabPage4.Size = new System.Drawing.Size(1118, 396);
this.tabPage4.TabIndex = 1;
this.tabPage4.Text = "tabPage4";
this.tabPage4.UseVisualStyleBackColor = true;
//


원래 화면에 추가했던 Control 클래스 대신에 버튼을 누르면 다른 클래스가 추가되도록 하고 싶다.

거기다가 새로 추가하는 것은 New Form2 를 추가하고 싶다.

순서는 tablPage5 로 화면 이동시키고, tabPage4 에 추가된 Control 을 전부 제거(Clear) 한 다음, tabPage4 에 추가된 모든 Control 들을 제거(remove) 했다.

그 다음에 새폼의 Control 을 추가(Add)했다.

불필요한 게 있을 수도 있다. 일단은 이렇게 추가해서 테스트를 해봤다.


private void Form2Tab_Click(object sender, EventArgs e)
{
     // tabPage5 선택창으로 화면 이동시키기
     tabControl2.Enabled = false;
     tabControl2.SelectedTab = tabPage4;
     tabControl2.Enabled = true;

     tabPage4.Controls.Clear(); // Controls 전부 제거
     foreach (Control item in tabPage4.Controls.OfType<Control>())
     {
         tabPage4.Controls.Remove(item);
     }

     this.Invoke(new MethodInvoker(delegate ()
     {
         // 다른 폼을 Tabpage/Panel 에 띄우기
         Form2 tabfrm = new Form2();
         tabfrm.TopLevel = false;
         tabfrm.TopMost = true;
         //panel1.Controls.Add(tabfrm);  // panel1 에다 추가
         //splitContainer6.Panel1.Controls.Add(tabfrm); //
splitContainer6.Panel1 에다 추가
         tabPage4.Controls.Add(tabfrm);
         tabfrm.Show();
     }));
}



원래 화면으로 복구시키는 것은 Designer.cs 파일에 있는 걸 Conrol.Add 해주면 된다.


private void toolStripButton5_Click(object sender, EventArgs e)
{
     // tabPage4 원래 화면으로 복구시키기
     tabControl2.Enabled = false;
     tabControl2.SelectedTab = tabPage4;
     tabControl2.Enabled = true;

     tabPage4.Controls.Clear(); // Controls 전부 제거
     foreach (Control item in tabPage4.Controls.OfType<Control>())
     {
         tabPage4.Controls.Remove(item);
     }
     tabPage4.Controls.Add(this.splitContainer4);
}


구글링해서 찾은걸 적어 놓는다.

private void btn_Click(object sender, EventArgs e)
{
    panel1.Controls.Clear(); //to remove all controls

    //to remove all comboboxes
    foreach (Control item in panel1.Controls.OfType<ComboBox>())
    {
        panel1.Controls.Remove(item);
    }

   //to remove control by Name
    foreach (Control item in panel1.Controls.OfType<Control>())
    {
        if (item.Name == "bloodyControl")
            panel1.Controls.Remove(item);
    }

    //to remove just one control, no Linq
    foreach (Control item in panel1.Controls)
    {
        if (item.Name == "bloodyControl")
        {
             panel1.Controls.Remove(item);
             break; //important step
        }
    }
}






블로그 이미지

Link2Me

,
728x90

C# dataGridView 에서 현재 셀의 속성을 이용하여 키보드가 Up 될(커서가 위치할) 때 해당 값을 텍스트박스로 출력하는 방법이다.



int columnIndex = dataGridView.CurrentCell.ColumnIndex;
int rowIndex = dataGridView.CurrentCell.RowIndex;

을 이용하는 것도 좋지만,

int rowIndex = dataGridView1.CurrentRow.Index; 를 사용하는게 더 좋은거 같다.

추가적으로

lbl_View1.Text = this.dataGridView1[dataGridView1.CurrentCell.ColumnIndex, dataGridView1.CurrentRow.Index].Value.ToString();

현재의 셀의 값을 읽어내는 것은 dataGridView1[칼럼,행] 으로 표기된다.

이걸 잘못해서 거꾸로 적었다가 낭패를 본 적도 있다.

셀 단위로 이동할 경우 자동으로 현재의 셀 값을 읽어낸다.


private void dataGridView1_KeyUp(object sender, KeyEventArgs e)
{
     int rowIndex = dataGridView1.CurrentRow.Index;

     textBox1.Text = dataGridView1.Rows[rowIndex].Cells[3].Value.ToString();
     textBox2.Text = dataGridView1.Rows[rowIndex].Cells[4].Value.ToString();
     textBox3.Text = dataGridView1.Rows[rowIndex].Cells[5].Value.ToString();
     textBox4.Text = dataGridView1.Rows[rowIndex].Cells[6].Value.ToString();
}


열(column) 의표시를 dataGridView 에서는 Cells 로 표현한다.

만약, 현재 커서가 위치한 셀의 값만 textBox1.Text 에 표시하고 싶다면


private void dataGridView1_KeyUp(object sender, KeyEventArgs e)
{
     int rowIndex = dataGridView1.CurrentCell.RowIndex;

     int columnIndex = dataGridView1.CurrentCell.ColumnIndex;

     textBox1.Text = dataGridView1.Rows[rowIndex].Cells[columnIndex].Value.ToString();
}


// 현재 dataGridView 셀의 값을 표기

if (dgv == dataGridView1)
{
    lbl_View1.Text = dgv[dgv.CurrentCell.ColumnIndex, dgv.CurrentRow.Index].Value.ToString();
}
else if (dgv == dataGridView2)
{
    lbl_View2.Text = dgv[dgv.CurrentCell.ColumnIndex, dgv.CurrentRow.Index].Value.ToString();
}



블로그 이미지

Link2Me

,
728x90

부모폼/자식폼이 아닌 New Form 으로 Form 을 띄울 때 중복 실행이 되는 걸 방지하는 방법이다.

폼 중복 실행방지, 폼의 위치를 원하는 위치에 설정, 자식폼으로 값을 넘기는 부분,

자식폼을 Show() 로 실행할 것인지 ShowDialog() 로 실행할 것인지를 모두 기록한 코드이다.


private void btnDictionary_Click(object sender, EventArgs e)
{
    //폼 중복 열기 방지
    foreach (Form openForm in Application.OpenForms)
    {
        if(openForm.Name == "WBrowser") // 열린 폼의 이름 검사
        {
            if(openForm.WindowState == FormWindowState.Minimized)
            {  // 폼을 최소화시켜 하단에 내려놓았는지 검사
                openForm.WindowState = FormWindowState.Normal;

                openForm.Location = new Point(this.Location.X + this.Width, this.Location.Y);

            }
            openForm.Activate();
            return;
        }
    }
    WBrowser wb = new WBrowser();  // 폼이 실행되지 않았으면 New Form 객체 생성
    // 자식폼으로 값을 넘겨줄 것이 있으면 이 부분에 코드를 추가

    wb.StartPosition = FormStartPosition.Manual;  // 원하는 위치를 직접 지정해서 띄우기 위해
    wb.Location = new Point(this.Location.X + this.Width, this.Location.Y); // 메인폼의 오른쪽에 위치토록
    wb.Show();
}


자식폼을 띄울 때 Show() 로 할 것인지, ShowDialog() 로 할 것인지에 코드가 약간 달라진다.

ShowDialog() 로 하려면 Show() 대신에 아래와 같이 코드를 작성해야 한다.

if (wb.ShowDialog() == DialogResult.OK)

{

     // 자식폼에서 받아서 처리할 내용

}


자식폼에서는 DialogResult = DialogResult.OK;  가 추가되어야 한다.


처음 인터넷에서 정보를 찾아서 헤매고 다닐때에는 무슨 의미인지도 몰랐는데 이제는 의미 파악이 되었다.

그래서 처음에 기록해두었던 것을 보완해서 작성을 했다.

혹시라도 이 게시글을 보는 초보자분은 도움되면 공감 꾸욱 눌러주세요.

블로그 이미지

Link2Me

,
728x90

엑셀처럼 셀을 클릭하면 해당 셀을 상단의 공간에 보여주기 위한 용도로 활용해봤다.


private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
       lbl_View.Text = this.dataGridView1[e.ColumnIndex, e.RowIndex].Value.ToString();
}


// MouseDown 이벤트 : 마우스 포인터가 컨트롤 위에 있을 때 마우스 단추를 클릭하면 발생

private void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
{
    lbl_View1.Text = this.dataGridView1[e.ColumnIndex, e.RowIndex].Value.ToString();
}


// MouseClick 이벤트 : 컨트롤을 마우스로 클릭할 때 발생

블로그 이미지

Link2Me

,

C# Controls

C#/문법 및 기능 2015. 9. 18. 15:29
728x90

VB.NET 과 C# 의 표현이 어떻게 다른지 알 수 있는 거 같아서 적어둔다.

'// Visual Basic
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
   Dim MyText As New TextBox()
   MyText.Location = New Point(25, 25)
   Me.Controls.Add(MyText)
End Sub

// C# private void button1_Click(object sender, System.EventArgs e) { TextBox myText = new TextBox(); myText.Location = new Point(25,25); this.Controls.Add (myText); }


블로그 이미지

Link2Me

,
728x90

1개의 폼안에 다수의 자식폼을 포함하는 형태의 프로그램들이 실생활에서 사용되고 있다.


1. 부모폼을 만드는 방법

    부모폼으로 만들고자 하는 Form 에서 아래 그림과 같이 설정해준다.



설정을 하고 나면 폼의 형태가 아래처럼 바뀐다.



2. 자식폼을 호출하는 방법

네이버, 구글링을 해보면 대부분 나오는 내용은

Form2 f2 = new Form2();
f2.MdiParent = this;  // 현재 폼의 자식폼임을 알림
f2.Show();

이다.

이 코드는 폼을 호출할 때마다 새로운 폼이 생성되기 때문에 실제 코드에서는 사용하는데 애로사항이 생긴다.


현재 폼이 열려있는지 체크하는 기능을 추가해야 한다.

부모폼의 ActiveMdiChild 속성을 이용하여 닫아주면 된다. ActiveMdiChild.Close();

자식폼 Form1 과 자식폼 Form2 를 생성하여 구별할 수 있게 만들었다.


 

부모폼에서 자식폼을 띄우는 소스코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace MDI
{
    public partial class Main : Form
    {
        private Form1 mChildForm1 = null;
        private Form2 mChildForm2 = null;
 
        public Main()
        {
            InitializeComponent();
        }
 
        private Form ShowOrActiveForm(Form form, Type t)
        {
            if (form == null)
            {
                form = (Form)Activator.CreateInstance(t);
                form.MdiParent = this;
                form.WindowState = FormWindowState.Maximized;
                form.Show();
            }
            else
            {
                if (form.IsDisposed)
                {
                    form = (Form)Activator.CreateInstance(t);
                    form.MdiParent = this;
                    form.WindowState = FormWindowState.Maximized;
                    form.Show();
                }
                else
                {
                    form.Activate();
                }
            }
            return form;
        }
 
        private void miForm1_Click(object sender, EventArgs e)
        {
            if (ActiveMdiChild != null)  // 자식폼이 열려 있으면
            {
                if(this.ActiveMdiChild != mChildForm1)  // 열려있는 자식폼이 Form1 이 아니면
                {
                    ActiveMdiChild.Close(); // 현재 활성화된 창을 닫아라
                }
                mChildForm1 = ShowOrActiveForm(mChildForm1, typeof(Form1)) as Form1;
            } else
            {
                mChildForm1 = ShowOrActiveForm(mChildForm1, typeof(Form1)) as Form1;
            }                 
        }
 
        private void miForm2_Click(object sender, EventArgs e)
        {            
            if (ActiveMdiChild != null)  // 자식폼이 열려 있으면
            {
                if (this.ActiveMdiChild != mChildForm2)  // 열려있는 자식폼이 Form2 가 아니면
                {
                    ActiveMdiChild.Close(); // 현재 활성화된 창을 닫아라
                }
                mChildForm2 = ShowOrActiveForm(mChildForm2, typeof(Form2)) as Form2;
            }
            else
            {
                mChildForm2 = ShowOrActiveForm(mChildForm2, typeof(Form2)) as Form2;
            }
        }
 
        private void miExit_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
 
        }
 
    }
}
 
 
cs


위 코드를 직접 다운로드 받아서 실행해볼 수 있는 파일


MDI.zip

구글링해서 찾은 소스를 약간 수정 보완해서 부모폼에서 자식폼이 1개만 실행되도록 수정했다.

if 문을 없애면 Form1, Form2 각각 둘다 실행된다.

폭풍 검색으로 구글링해서 찾아낸 가장 쓸만한 코드인거 같다. 좀더 실력이 쌓이면 더 좋게 만들날이 오겠지만~


원코드 출처 : http://www.codeproject.com/Tips/257281/Single-Instance-Form-in-a-MDI-application


참고 : http://colorscripter.com/ 는 소스코드를 보기 좋게 정렬해주는 사이트인데 저질 기억이라 이걸 찾는데 애를 먹어 아예 기록을 해둔다.


블로그 이미지

Link2Me

,
728x90

기능을 익히기 위해 연습하는 sln 프로젝트에 새로운 WinForm 을 추가하고 기존에 작성된 WinForm 을 없애기로 했다.


방법은 새로운 WinForm 을 추가하여 기존에 작성했던 폼의 자료를 복사하고 코드를 복사하는 것이다.

물론 Layout 은 새로 구성했다.


Layout 도 새로 구성했지만 여전히 기존 WinForm 이 메인으로 나올 것이다.

Program.cs 파일을 열어서 아래처럼 Namespce 와 Application.Run(new MainForm()); 을 변경해주어야 한다.

만약 Namespace 를 동일하게 했다면 Application.Run(new MainForm()); 부분만 변경해주면 된다.


namespace MySQLConnection
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MainForm());
        }
    }
}


이걸 작성하면서 느낀 점은 Layout 구성할 때 가장 먼저 menuStrip 을 먼저 구성한 다음에 TabControl 을 구성해야 겠다는 걸 알게 되었다.

먼저, TabControl 을 추가해 놓고 menuStrip 을 추가하니까 TabPage 안에 메뉴가 추가된다.




ListView 기능을 배우면서 정리를 해보고자 Layout 을 dataGridView 와 ListView 탭으로 구분했다.

dataGridView 와 ListView 의 차이점을 좀 더 명확하게 이해하면서 정리하는데 도움이 될 거 같아서다.


'C# > Visual Studio' 카테고리의 다른 글

.NET 4.0 설치 프로그램  (1) 2015.10.25
Visual Studio 2015 라인번호 보이게 하기  (0) 2015.10.06
C# statusStrip 메뉴  (2) 2015.09.10
What's New in C# 6.0  (0) 2015.09.05
C# Name 명칭 변경  (0) 2015.09.02
블로그 이미지

Link2Me

,
728x90

ListView는 목록을 표시하는 컨트롤이다.


ListView 를 Layout 에 추가하는 방법은 도구상자에게 ListView 를 Drag 해서 뿌려질 화면위에 놓는다.




폼에서 설정해주면 *.Designer.cs 파일에 설정값이 저장된다.

this.listView1.GridLines = true;

this.listView1.View = System.Windows.Forms.View.Details;

폼 UI 에서 설정하지 않고 사용자 소스파일에서 listView1.View = View.Details; 라고 직접 설정해줘도 된다.


FullRowSelect : 항목이 선택될 때 하위 항목까지 한줄 전체를 선택한다.

MultiSelect : 복수 개의 항목을 선택할 수 있는지를 지정한다.

LabelEdit : 실행 중에 항목을 직접 편집할 수 있는지의 여부를 지정한다. default 는 false 이다.

LabelWrap : 항목의 텍스트를 줄바꿈하여 출력할 것인가를 지정한다.

Focuseditem : 현재 포커스를 가진 항목을 조사한다.



ListView 의 열(Column)의 편집은 칼럼(열)의 헤더를 설정(text, size)하는 방법이다.




칼럼 헤더의 Text, TextAlign, Width 를 지정한다.





dataGridView 와는 달리 listView 에서는 행(Row)는 첫열을 기준으로 해서 Item, 다음열부터는 subItem 으로 값을 입력한다.



listView1.Items.Clear(); // 데이터 내용 전부 지우기

listView1.Items.Count;  // 전체 항목의 개수 카운트


// listView 헤더행 숨기기

listView1.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None;


선택된 항목 지우기

if (listView1.SelectedItems.Count == 0)
{
    MessageBox.Show("선택된 항목이 하나도 없습니다.");
}
else
{
    while (listView1.SelectedItems.Count > 0)
        listView1.Items.Remove(listView1.SelectedItems[0]);
}



if (listView1.SelectedItems.Count > 0)
{
    int index = listView1.SelectedIndices[0]; // 선택된 첫번째 레코드의 인덱스
    foreach (ListViewItem row in listView1.SelectedItems)
    {

        int index = row.index;

        listView1.Items.Remove(row);  // 선택한 행 삭제
       
// listView1.Items[index].Remove();  // 다. index

    }
}


for (int row = 0; row < listView1.Items.Count; row++)
{
    string text = listView1.Items[row].SubItems[4].Text;
    if (Left(text,1) =="(" && Right(text,1) ==")")
    {
        listView1.Items[row].Remove();  // 선택한 행 삭제
    }
}


for (int row = listView1.SelectedIndices.Count - 1; row > 0; row--)
{
    index = listView1.SelectedItems[row].Index//
    listView1.Items[index].Remove(); // 삭제는 index 번호가 큰번호에서 작은번호 순으로
}



리스트 추가하기

private void btnAdd_Click(object sender, EventArgs e) // 추가 버튼
{
    ListViewItem lvt = new ListViewItem();
    lvt.Text = textBox1.Text;
    lvt.SubItems.Add(textBox2.Text);
    lvt.SubItems.Add(textBox3.Text);
    lvt.SubItems.Add(textBox4.Text);
    lvt.SubItems.Add(textBox5.Text);
    listView1.Items.Add(lvt);

    listView1.FullRowSelect = true;  // 행단위로 선택


    textBox1.Text ="";
    textBox2.Text ="";
    textBox3.Text ="";
    textBox4.Text ="";
    textBox5.Text ="";

}


* 다른 방법으로
ListViewItem lvt = new ListViewItem();
lvt.Text = textBox1.Text;

2줄을 한줄로 줄여서

ListViewItem lvt = new ListViewItem(textBox1.Text);

로 해도 된다.


리스트 수정하기

private void btnChange_Click(object sender, EventArgs e)    // 변경 버튼
{
    if (listView1.SelectedIndices.Count > 0)
    {
        listView1.SelectedItems[0].SubItems[0].Text = textBox1.Text;
        listView1.SelectedItems[0].SubItems[1].Text = textBox2.Text;
        listView1.SelectedItems[0].SubItems[2].Text = textBox3.Text;
        listView1.SelectedItems[0].SubItems[3].Text = textBox4.Text;
        listView1.SelectedItems[0].SubItems[4].Text = textBox5.Text;
    }
}


리스트 읽어오기

private void listView1_Click(object sender, EventArgs e)  // 해당 Row 클릭시 읽어오기
{
    if (listView1.SelectedIndices.Count > 0)
    {
        textBox1.Text = listView1.SelectedItems[0].SubItems[0].Text;
        textBox2.Text = listView1.SelectedItems[0].SubItems[1].Text;
        textBox3.Text = listView1.SelectedItems[0].SubItems[2].Text;
        textBox4.Text = listView1.SelectedItems[0].SubItems[3].Text;
        textBox5.Text = listView1.SelectedItems[0].SubItems[4].Text;
    }
}


private void listView1_KeyUp(object sender, EventArgs e)  // 해당 Row 에 키보드가 놓일때
{
    if (listView1.SelectedIndices.Count > 0)
    {
        textBox1.Text = listView1.SelectedItems[0].SubItems[0].Text;
        textBox2.Text = listView1.SelectedItems[0].SubItems[1].Text;
        textBox3.Text = listView1.SelectedItems[0].SubItems[2].Text;
        textBox4.Text = listView1.SelectedItems[0].SubItems[3].Text;
        textBox5.Text = listView1.SelectedItems[0].SubItems[4].Text;
    }
}



번호 매기기

for(int i=0 ; i < listView1.Items.Count ; i++)
{
    listView1.Items[i].SubItems[0].Text = (i + 1).ToString();
}


foreach (ListViewItem item in listView1.Items)
{
    // 수행할 내용
}



열의 특정값 변경

private void LVCellUpdate(ListView LV)
{
    int value = 0;
    foreach (ListViewItem row in LV.Items)
    {
        int.TryParse(row.SubItems[4].Text, out value);
        if (value == 10)
        {
            row.SubItems[4].Text = "보통";
        }
    }
}



private void LVCellUpdate(ListView LV)
{
    int value = 0;
    for (int row = 0; row < LV.Items.Count; row++)
    {
        //MessageBox.Show(LV.Items[row].SubItems[4].Text);
        int.TryParse(LV.Items[row].SubItems[4].Text, out value);
        if (value == 10)
        {
            LV.Items[row].SubItems[4].Text = "보통";
        }
    }
}


각 행(row)을 반복해서 돌아가면서 해당 행의 특정열의 값을 구하거나 다른 값으로 치환하고자 할 경우에는 LV.Items[row].SubItems[4].Text; 만 알면
선택된 행으로부터 currentindex 를 구할 수가 있다.
index 만 구하면 해당행을 삭제하거나 병합할 수 있다.


listView1.Items[previousindex].Selected = true;  //


listView2.Items[index].EnsureVisible();  // 내용을 스크롤하여 항목이 컨트롤에 표시되도록 함


// 상은

private void listView_ColorSet(ListView LV)
{
    for (int row = 0; row < LV.Items.Count; row++)
    {
        if (LV.Items[row].BackColor.Equals(Color.Aquamarine))
        {
            LV.Items[row].BackColor = Color.Aquamarine;
        } else if (LV.Items[row].BackColor.Equals(Color.YellowGreen))
        {
            LV.Items[row].BackColor = Color.YellowGreen;       
        }
        else
        {
            LV.Items[row].BackColor = Color.White;
        }               
    }
}

블로그 이미지

Link2Me

,
728x90

C# 에서 MySQL 구문과 연동처리하는 부분에서 좀 고생을 해서 적어둔다.


MySQL 칼럼에 인덱스를 걸어야 속도가 빠르지만, 칼럼에 변형을 가해서 인덱스 무시하고 처리했다.

substring(d_modify,1,8)='" + DateTime.Now.ToString("yyyyMMdd") + "'


MySQL d_modify 칼럼은 변경된 날짜를 기록하는 칼럼인데 php 에서 값을 저장할 때 varchar(14) 로 날짜의 형식을 일반적인 php 날짜 형식과 약간 다르게 yyyyMMddHHmmss 로 저장된다.

연도,월,날짜,시,분,초를 구분자 없이 14자리를 저장한다.

오늘 날짜(년월일) yyyyMMdd 8자리만 MYSQL substring 함수를 이용하였다.

MySQL 칼럼은 string(문자열) 인 경우에는 d_modify ='값' 으로 처리한다.

여기에 C# 에서 입력되는 변수를 적용하려면 " + 입력값 + " 를 ' ' 사이에 넣어준다.


dataGridView 화면 내부에서 직접 자료를 갱신하는 경우가 아니라 외부의 값을 넣어야 하는 부분을 몰라 고생을 좀 했다.

content 칼럼을 업데이트하는 부분과 d_modify 칼럼을 업데이트하는 부분을 서로 다르게 처리한다.

[2] 와 같이 해주거나, ["@d_modify"] 해줘야 제대로 동작된다.

["d_modify"] 이런식으로 하면 에러가 발생한다.


// Set the UPDATE command and parameters.
d_modify_value = DateTime.Now.ToString("yyyyMMddHHmmss");
adapter.UpdateCommand = new MySqlCommand(
    "UPDATE data SET content=@content,d_modify=@d_modify WHERE uid=@uid;", myConn);
adapter.UpdateCommand.Parameters.Add("@uid", MySqlDbType.Int16, 11, "uid");
adapter.UpdateCommand.Parameters.Add("@content", MySqlDbType.VarChar, 255, "content");
adapter.UpdateCommand.Parameters.Add("@d_modify", MySqlDbType.VarChar, 14);
adapter.UpdateCommand.Parameters[2].Value = d_modify_value// 외부 값을 저장
adapter.UpdateCommand.UpdatedRowSource = UpdateRowSource.None;



'C# > C# SQL' 카테고리의 다른 글

C# DataSet  (6) 2015.12.20
C# MySQL 간단 코드 및 접속 기본지식 배우기  (0) 2015.12.04
C# 콤보박스(comboBox) 와 SQL 연동  (0) 2015.09.10
C# 과 MySQL 연동  (0) 2015.08.29
C# ExecuteScalar 와 총 Record 수  (0) 2015.08.27
블로그 이미지

Link2Me

,
728x90

Regex 클래스를 사용하여 특정 문자 패턴을 찾는다.
Regex.Match() 메서드는 매치된 정보를 갖는 Match 클래스 객체를 리턴한다
매치된 문자열이 존재하면 Match.Success 속성이 True가 되고, Match.Index 속성을 통해 문자 패턴 위치를 알 수 있다.

string str = "서울시 서초구 양재동 우리아파트";
Regex regex = new Regex("우리");
Match m = regex.Match(str);
if (m.Success)
{
    Debug.WriteLine("{0}:{1}", m.Index, m.Value);
}


메타문자  의미
^        라인의 처음     
$        라인의 마지막   
\w       문자(영숫자) [a-zA-Z_0-9]
\s       Whitespace (공백,뉴라인,탭..)
\d       숫자
*        Zero 혹은 그 이상
+        하나 이상
?        Zero 혹은 하나
.        Newline을 제외한 한 문자
[ ]      가능한 문자들
[^ ]     가능하지 않은 문자들
[ - ]    가능 문자 범위
{n,m}    최소 n개, 최대 m개
(  )     그룹
|        논리 OR




//텍스트박스에 한글만 입력하기
using System.Globalization;
private void textBox1_TextChanged(object sender, EventArgs e)
{
    char[] inputchars = textBox1.Text.ToCharArray();
    var sb = new StringBuilder();
    foreach (var item in inputchars)
    {
        if (char.GetUnicodeCategory(item) == UnicodeCategory.OtherLetter)
        {
            sb.Append(item);
        }
    }
    textBox1.Text = sb.ToString().Trim();
}


// 한글입력이 아닌 경우 한글만 입력하라고 팝업창을 띄우고자 할 경우

private void textBox1_TextChanged(object sender, EventArgs e)
{
    char[] inputchars = textBox1.Text.ToCharArray();
    var sb = new StringBuilder();
    foreach (var item in inputchars)
    {
        if (char.GetUnicodeCategory(item) == UnicodeCategory.OtherLetter)
        {
            sb.Append(item);
        }
        else
        {
            MessageBox.Show("한글만 입력해주세요");
        }
    }
    textBox1.Text = sb.ToString().Trim();
}


//텍스트박스에 영어만 입력하기
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{   
    if(!(Char.IsLetter(e.KeyChar)) && e.KeyChar != 8)   
// 키값 8번은 백스페이스 값   

    {       

         e.Handled = true;   
    }
}

private void textBox1_Leave(object sender, System.EventArgs e)
{   
    Regex regex = new Regex(@"[a-zA-Z]");   
    Boolean ismatch = regex.IsMatch(textBox1.Text);   
    if (!ismatch)   
    {       
        MessageBox.Show("영문자만 입력해 주세요.");   
    }
}

//텍스트박스에 숫자만 입력하기
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{   
    if(!(Char.IsDigit(e.KeyChar)) && e.KeyChar != 8)   
    {       
        e.Handled = true;   
    }
}

private void textBox1_Leave(object sender, System.EventArgs e)
{   
    Regex regex = new Regex(@"[0-9]");   
    Boolean ismatch = regex.IsMatch(textBox1.Text);   
    if (!ismatch)   
    {       
        MessageBox.Show("숫자만 입력해 주세요.");   
    }
}


private void textBox1_Leave(object sender, System.EventArgs e)
{
    Regex regex = new Regex(@"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$"); // 이메일
    Boolean ismatch = regex.IsMatch(textBox1.Text);
    if (!ismatch)
    {
        MessageBox.Show("E-Mail 형식만 가능합니다");
    }
}



텍스트박스 입력을 하고 엔터키가 눌려졌을 경우

private void SearchBox_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        btnMovieSearch_Click(sender, e);
    }
}


private void btnMovieSearch_Click(object sender, EventArgs e)
{
    if (this.SearchBox.Text == "")
    {
        MessageBox.Show("검색어를 입력하세요", "알림", MessageBoxButtons.OK, MessageBoxIcon.Warning);
        this.SearchBox.Focus();
    }
    else
    {
        string url = string.Format("http://movie.naver.com/movie/search/result.nhn?query={0}&section=all&ie=utf8", SearchBox.Text.Trim());
        System.Diagnostics.Process.Start(url);
    }
}


텍스트박스 속성을 읽기전용으로 하고 싶은 경우

textBox1.ReadOnly = true;
textBox1.BackColor = System.Drawing.SystemColors.Window; // 배경색이 다르게 보이지 않도록 처리


텍스트박스에 커서가 맨마지막 글자위에 움직이게 하고 싶은 경우

textBox1.Focus(); // 선택하고
textBox1.SelectionStart = textBox1.Text.Length; // 글자의 마지막을 선택
textBox1.ScrollToCaret(); // 선택된 위치에 스크롤을 움직인다




'C# > 문법 및 기능' 카테고리의 다른 글

C# 과 VB 문법 차이  (0) 2015.09.22
C# Controls  (0) 2015.09.18
C# 콤보박스(comboBox)  (0) 2015.09.09
C# 키 입력처리 이벤트, Load Event, Form_Closing  (0) 2015.08.30
C# 정규식을 이용한 문자열 체크  (0) 2015.08.25
블로그 이미지

Link2Me

,
728x90

기능을 익히는 가장 간단한 방법은 유투브 동영상을 검색하는 거다.

검색어 : C# statusStrip

을 입력하면 관련 동영상 강좌가 나온다. 영어 몰라도 대충 그림보면 이해된다.




기본 생성되는 statusStrip1 을 mainstatusStrip 이라고 .Name 을 변경해줬다.





statusStrip 속성을 선택한 다음에 아래 1번을 누르면...


컬렉션 편집기 창이 뜬다.


Spring 속성을 변경하면 위치가 변경된다.

실제로 하단에 표시될 내용을 입력해보자.

코드를 죽 적는 것보다 깔끔하게 처리하려고 폼(form) 이 로드될 때 statusStrip 창에 보여질 내용을 함수로 만들었다.


private void MainForm_Load(object sender, EventArgs e)
{
    status_date();
}


private void status_date()
{
     // using System.Globalization; 추가 해줘야 날짜가 나옴           
     CultureInfo cultures = CultureInfo.CreateSpecificCulture("ko-KR");
     tS_date.Text = "오늘 : " + DateTime.Now.ToString(string.Format("yyyy년 MM월 dd일 ddd요일", cultures));
}

출력되는 모습을 볼 수 있다.

'C# > Visual Studio' 카테고리의 다른 글

Visual Studio 2015 라인번호 보이게 하기  (0) 2015.10.06
C# 메인폼 변경하는 방법  (0) 2015.09.15
What's New in C# 6.0  (0) 2015.09.05
C# Name 명칭 변경  (0) 2015.09.02
C# 윈도우폼(로그인폼) 실행 팁 배우기  (0) 2015.08.17
블로그 이미지

Link2Me

,
728x90

콤보박스에 뿌려질 category 리스트를 MySQL 데이터베이스와 연동하는 방법을 해봤다.

정말 힘들게 겨우 구현에 성공했다.

comboBox에 뿌려질 리스트를 만드는 것은 어렵지 않다.

문제는 값을 선택했을 때, Event 가 발생하도록 연동처리하는 것을 아직 완벽하게 이해하지 못했다.

uid 값을 한번에 넘기는 방법이 있을거 같은데 ㅠㅠㅠ

C# 배운지 한달도 안되는데 이 정도 구현한 것만으로도 나자신을 대견하게 생각해야 하겠지.

무식하게 2단계로 나눠서 comboBox1을 선택하면 cat1name 을 받아서 cat1uid 를 다시 조회하는 Query 문을 만든다음에 data 테이블로 결과를 던져서 원하는 결과를 가져오는 로직으로 구현을 했다.


void cat1comboBox()
{
    comboBox1.Items.Clear();
    comboBox1.Items.Add("전체");
    try
    {
        myConn = new MySqlConnection(ConnectionString);
        myConn.Open();
        string strqry = "select uid, name from category where relateduid=0";
        strqry += " order by uid";
        adapter = new MySqlDataAdapter(strqry, myConn);
        DataSet cat1 = new DataSet();
        adapter.Fill(cat1);
        foreach (DataRow dr in cat1.Tables[0].Rows)
        {
            comboBox1.Items.Add(dr["name"]);
        }

        comboBox1.SelectedIndex = 0;  // 첫번째 아이템 선텍

    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
    finally
    {
        this.myConn.Close();
    }
}

DataTable cat2comboBox(string category1)
{
    comboBox2.Items.Clear();
    comboBox2.Items.Add("전체");
    try
    {
        myConn = new MySqlConnection(ConnectionString);
        myConn.Open();
        string strqry = "select uid, name from category";
        strqry += " where relateduid=(select uid from category where relateduid=0 and name='" + category1 + "')";
        strqry += " order by uid";
        adapter = new MySqlDataAdapter(strqry, myConn);
        DataSet cat2 = new DataSet();
        adapter.Fill(cat2);
        foreach (DataRow dr in cat2.Tables[0].Rows)
        {
            comboBox2.Items.Add(dr["name"]);
        }
        return cat2.Tables[0];
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
        return null;
    }
    finally
    {
        this.myConn.Close();
    }
}


private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    cat2 = cat2comboBox(comboBox1.SelectedItem.ToString());
    cat1name = comboBox1.SelectedItem.ToString(); // data 테이블 검색어 전달

    myConn = new MySqlConnection(ConnectionString);
    myConn.Open();
    string strqry = "select uid from category";
    strqry += " where relateduid=0 and name='" + cat1name + "' ";
    MySqlCommand cmd = new MySqlCommand(strqry, myConn);
    cmd.CommandType = CommandType.Text;
    MySqlDataReader dr = cmd.ExecuteReader();
    while (dr.Read())
    {
        cat1uid = dr.GetString(0);
    }
    dr.Close();
    myConn.Close();
}

private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
{
    cat2name = comboBox2.SelectedItem.ToString(); // data 테이블 검색어 전달
    myConn = new MySqlConnection(ConnectionString);
    myConn.Open();
    string strqry = "select uid from category";
    strqry += " where relateduid='" + cat1uid + "' and name='" + cat2name + "' ";
    MySqlCommand cmd = new MySqlCommand(strqry, myConn);
    cmd.CommandType = CommandType.Text;
    MySqlDataReader dr = cmd.ExecuteReader();
    while (dr.Read())
    {
        cat2uid = dr.GetString(0);
    }
    dr.Close();
    myConn.Close();
}


-------------------------------------------------------------------------

함수를 더 정교하게 사용하는 방법은

comboBox1 부분을 CB 로 변경하는 것이다.

즉 comboBox CB 로 함수 인자를 만들어서 받으면 된다.



'C# > C# SQL' 카테고리의 다른 글

C# MySQL 간단 코드 및 접속 기본지식 배우기  (0) 2015.12.04
C# MySQL 쿼리문과 연동 처리  (0) 2015.09.12
C# 과 MySQL 연동  (0) 2015.08.29
C# ExecuteScalar 와 총 Record 수  (0) 2015.08.27
C# 과 MySQL 연결을 위한 준비  (0) 2015.08.05
블로그 이미지

Link2Me

,
728x90

combobox 컨트롤은 여러개의 아이템 중에서 하나를 고를때 선택한다.



도구상자에서 comboBox 를 추가하면 default 는 DropDown 이 선택된다. 직접 변경하려면 DropDownStyle이라는 속성에서 지정한다.


private void AddComboBox() // 콤보박스에 추가
{  
   comboBox1.Items.Add(textBox1.Text); // 항목을 추가
 
   if (comboBox1.Items.Count > 0) // 항목이 있으면, 방금 입력한 항목을 선택
      comboBox1.SelectedIndex = comboBox1.Items.Count - 1;
}

private void GetComboBox()  // 콤보박스 선택을 TextBox1 에 표시
{
   textBox1.Text = comboBox1.SelectedItem.ToString();
}


private void Form1_Load(object sender, EventArgs e)
 {
       comboBox1.Items.Add("Item 1");
       comboBox1.Items.Clear();
        comboBox1.Items.AddRange(new string[] { "나미", "현숙", "효린" });
 }


private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    if (comboBox1.SelectedIndex >= 0)  // index 는 0 부터 시작됨
    {
          cate1.Text = comboBox1.SelectedItem.ToString();  // SelectedItem 은 선택된 값
          textBox1.Text = comboBox1.SelectedIndex.ToString();  // Index 는 0, 1, 2
          MessageBox.Show(comboBox1.SelectedItem.ToString());
     }
}




comboBox1을 선택하면 comboBox2 의 값이 변하게 하는 방법을 알아보자.

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{           
     if (comboBox1.SelectedIndex >= 0)  // index 는 0 부터 시작됨
     {
          cate1.Text = comboBox1.SelectedItem.ToString();
          textBox1.Text = comboBox1.SelectedIndex.ToString();
      }
      if (comboBox1.SelectedIndex == 0)
      {
           comboBox2.Items.Clear();
           comboBox2.Items.Add("A1");
           comboBox2.Items.Add("A2");
           comboBox2.Items.Add("A3");
      }
      else if (comboBox1.SelectedIndex == 1)
      {
           comboBox2.Items.Clear();
           comboBox2.Items.Add("B1");
           comboBox2.Items.Add("B2");
           comboBox2.Items.Add("B3");
      }
      else if (comboBox1.SelectedIndex == 2)
      {
           comboBox2.Items.Clear();
           comboBox2.Items.Add("C1");
           comboBox2.Items.Add("C2");
      }
}





블로그 이미지

Link2Me

,
728x90

화면 Layout 을 보기 좋게 하기 위해서 SplitContainer 클래스를 이용한다.

유투브 동영상을 보면서 익힌 사용법을 나중에 다시 보려고 기록해둔다.

tabControl Layout 에서 아래 번호 순서대로 하면 된다.



SplitContainer 클래스를 사용하면 기본적으로 수직분할이 된다.

A Split Container is a combination of three components.  Panel1 and Panel2 are separated either horizontally or vertically by a splitter.


수직으로 분할하기 위해서는

먼저 splitContainer2 를 찾아서 선택한다. (최초로 splitContainer 를 사용한 경우에는 splitContainer1 을 선택)

그래야만 Orientation 속성이 보인다. Horizontal 로 변경하면 ....


수직으로 분할된 창이 보일 것이다.

Panel1, Panel2 를 선택하면 7번처럼 창의 위치를 조정할 수가 없다.

마찬가지로 splitContainer2 속성이 선택되어야만 가능하다.


상단에 검색할 버튼을 만들기 위함이고 하단에는 dataGridView 을 추가하기 위한 Layout 이다.




Panel1 과 Panel2 사이를 움직이지 못하게 하는 방법은

split container 속성의 IsSplitterFixed true 로 설정하면 고정된다.




고정하고 싶은 Panel 부분에 2줄을 추가해주면 된다.

this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel1;
this.splitContainer1.IsSplitterFixed = true;

Designer.cs 파일에 기록된 정보를 확인해 보니...

// splitContainer1
//
this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;
this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel1;
this.splitContainer1.IsSplitterFixed = true;
this.splitContainer1.Location = new System.Drawing.Point(3, 3);
this.splitContainer1.Name = "splitContainer1";
this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal;
//
// splitContainer1.Panel1
//
this.splitContainer1.Panel1.Controls.Add(this.lbl_View);
this.splitContainer1.Panel1.Controls.Add(this.comboBox2);
this.splitContainer1.Panel1.Controls.Add(this.comboBox1);
this.splitContainer1.Panel1.Controls.Add(this.lbl_totalcnt1);
this.splitContainer1.Panel1.Controls.Add(this.totalcnt1);
this.splitContainer1.Panel1.Controls.Add(this.btnSave);
this.splitContainer1.Panel1.Controls.Add(this.btnSearch);
this.splitContainer1.Panel1.Controls.Add(this.searchBox);
//
// splitContainer1.Panel2
//
this.splitContainer1.Panel2.Controls.Add(this.dataGridView1);
this.splitContainer1.Size = new System.Drawing.Size(1146, 462);
this.splitContainer1.SplitterDistance = 39;
this.splitContainer1.TabIndex = 0;



관련 추가 자료는 참조

http://www.c-sharpcorner.com/uploadfile/6897bc/container-controls-3-splitcontainer/


C# 에 대해 좀더 알아보면 좋은 사이트

http://www.java2s.com/Code/CSharpAPI/CatalogCSharpAPI.htm



블로그 이미지

Link2Me

,
728x90

Layout 구성을 하는 방안으로 TabControl 기능을 이용하여 작업을 해봤다.


tabControl1 의 TabPages 컬렉션을 클릭하면



컬렉션 편집기 창이 뜬다.

칼럼을 추가하거나 삭제 또는 칼럼명을 수정한다.

tabPage 는 기본으로 2개가 생성된다.



TabConrol 의 위치를 변경하고 싶다면






tabControl1.TabPages.Remove(tabPage1); // tabPage1 안보이게 처리

tabControl1.TabPages.RemoveAt(1); // RemoveAt(index) 을 사용하면 인덱스 번호를 적어준다.

인덱스번호를 적어주는 것보다는 직접 해당 이름을 적어주는게 더 편하다.


splitContainer1.Panel1Collapsed = true;  // 한 Panel Load 되지 않았으므로 Panel1 공간 제거

tabControl.TabPages.Insert(0, tabPage1); // Show the tab page (insert it to the correct position)
tabPage1.Enabled = false; // this disables the controls on it
tabPage1.Visible = false; // this hides the controls on it.


블로그 이미지

Link2Me

,
728x90

C# 6.0 에서 새로워진 것이 무엇인지 비교해놓은 곳이 있다.


http://www.codeproject.com/Tips/1023426/Whats-New-in-Csharp


before C# 6.0

string name = "Murphy Cooper";
string planet = "Cooper Station";
WriteLine("{0} is actually named after {1}", planet, name);


After C# 6.0

string name = "Murphy Cooper";
string planet = "Cooper Station";
/* Magic happens here */
WriteLine($"{planet} is actually named after {name}");

변수 대입하는 걸 직관적으로 이해할 수 있게 변경한 거 같다.


다른 자세한 사항은 위 URL 링크를 눌러서 들어가 보면 된다.

'C# > Visual Studio' 카테고리의 다른 글

C# 메인폼 변경하는 방법  (0) 2015.09.15
C# statusStrip 메뉴  (2) 2015.09.10
C# Name 명칭 변경  (0) 2015.09.02
C# 윈도우폼(로그인폼) 실행 팁 배우기  (0) 2015.08.17
C# 윈도우폼 ContextMenu 만들기  (0) 2015.08.02
블로그 이미지

Link2Me

,