Tip !!! (56) 썸네일형 리스트형 멀티 텍스트박스 Multi TextBox 에서 추가한 곳으로 스크롤 화면 이동 텍스트박스.ScrollToCaret(); // 현재위치로 스크롤 시리얼포트 읽기 DataReceived 한문장이 한번에 안들어 올때 타이머를 이용하여 해결함 private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) { buff += serialPort.ReadExisting(); // buff에 한문장이 한번에 잘 안들어옴 // 그래서 타이머를 사용하여 일정시간 buff에 누적 저장한 후 // 타이머 Event에서 한번에 출력 타이머간격은 0.3초가 적당 } private void timer1_Tick(object sender, EventArgs e) { txtOut.AppendText( buff + "\r\n" ); buff = ""; }//func 사용자정의 Control 에 있는 내부 컨트롤의 event 받기(2) 앞전에 소개한 방법과 다른 방법을 소개합니다. 이번에는 UserControl 내부에 다음과 같이 코드를 작성합니다. UserControl Modifier속성은 Private라도 상관 없습니다. public void setEventClick(System.EventHandler f1, System.EventHandler f2) { button1.Click += f1; button2.Click += f2; } 그리고 메인폼에서는 전에 사용한 code를 다음과 같이 바꿔주세요. private void Form1_Load(object sender, EventArgs e) { myControl.setEventClick ( myButton1_Click , myButton2_Click ); } Serialize 사용 이진파일로 구조체 / Class 저장하고 읽기 [Serializable] struct Data { public int i; public string s; } static void Main(string[] args) { Data[] data = new Data[2]; data[0].i = 1; data[0].s = "string1"; data[1].i = 2; data[1].s = "string22"; FileStream fs = new FileStream("test.dat", FileMode.Create); BinaryFormatter bf = new BinaryFormatter(); // 읽기 쓰기에 다 사용 bf.Serialize(fs, data); fs.Close(); Data[] result; fs = new FileStream("test.d.. Serialize 사용 안하고 이진파일로 구조체 / Class 저장하고 읽기 Serialize 사용 안하고 이진파일로 구조체 / Class 저장하고 읽기 규조체 내부에 이진파일 Write() Read() 메소드 만들어 사용 struct Data { public int i; public string s; public void Write(System.IO.BinaryWriter _bw) { _bw.Write(i); _bw.Write(s); } public void Read(System.IO.BinaryReader _br) { i=_br.ReadInt32(); s=_br.ReadString(); } } // 구조체 끝 static void Main() { Data[] data = new Data[2]; / / 구조체 배열 생성 data[0].i = 1; data[0].s = "stri.. 문자열 나누기 StringSplit string s = "국어 90 영어 100 수학 90"; string[] sArray=s.Split( new char[] { ' ' } ); //공백을 기준으로 문자열 나누기 sArray[0] 은 "국어" sArray[1] 은 "90" sArray[2] 은 "영어" sArray[3] 은 "100" sArray[4] 은 "수학" sArray[5] 은 "90" 코드값을 문자로 전환 / 문자코드값 구하기 static void Main(string[] args) { string s = "aabcde"; char[] a = s.ToCharArray(); // string을 char[]로 복사 Console.WriteLine($"원본 문자열 : {s} 문자수 {s.Length}"); a[2] = (char)(0xac00); // 코드값을 문자로 전환 '가' a[3] = (char)(0xd55c); // '힌' // string ss = new string(a); // char[]로 새로운 string생성 s=new string(a); // Console.WriteLine($"복사 문자열 : {ss} 문자수 {ss.length}"); Console.WriteLine($"수정 문자열 : {s} 문자수 {s.Len.. 실행한 외부프로그램 종료까지 기다리기 using System.Diagnostics; Process ps = new Process(); ps.StartInfo.FileName = "실행파일이름"; ps.Start(); ps.WaitForExit(); 인수 없이 외부프로그램 실행시키기 using System.Diagnostics; Process ps = new Process(); // 객체생성후 실행 ps.StartInfo.FileName = "실행파일이름"; ps.Start(); using System.Diagnostics; Process.Start( "실행파일이름" ); // 간편 버젼 커맨드 라인 인자 전달 외부프로그램 실행 외부프로그램에 인자를 전달하면서 실행 시키기 명령프롬프트( 옛날 Dos창 같은)에서 프로그램을 실행 시킬때 인자를 전달 하려면 ] 예제.exe 인수1 인수2 인수3 이것을 C# 코딩으로 해보자.. using System.Diagnostics; Process ps = new Process(); ps.StartInfo.FileName = "ExeFile.exe"; // 실행파일이름 ps.StartInfo.Arguments = String.Format($"{인수1} {인수2} {인수3}"); // 인자 string만들기 ="인수1 인수2 인수3" ps.Start(); // 외부프로그램실행 참고로 실행 프로그램에서인수 받을때는 ( C++ 은 argv C#은 args ) argv[0] = "ExeFile.exe".. 특정비트값 세팅 토글 변경 예로 설명해 보겠습니다. 두개의 변수 a,b a= 0b11010001 b=0b00110011 변수의 3번째 비트 ( index는 2)를 반전 시켜 보겠습니다. mask= 0b10000000; // 마스크 초기값 mask= mask >> index; // mask =0b00100000 index만큼 오른쪽으로 이동 [ a 경우 ] a & mask Result 0b00000000 ( 0임 ) a + = mask; 하면 a는 0b11110001 이 됨 (bit 반전) 또는 a | = mask ; OR연산도 같은 값 [ b 경우 ] b & mask Result 0b00100000 ( 0이 아님) b - = mask; 하면 b는 0b00010011 이 됨 (bit 반전 ) 또는 b & = ! mask; 도 같은 .. 사용자정의Control이 메인폼의 Control에 접근하기 UserControl에서 Control properties를 만들어 넘겨 받으면 끝. [ UserControl 에서] TextBox tBox; [Category("txtBox"), Description("explanation")] //속성추가 public TextBox txtBox{ get { return tBox; } set { tBox = value; } } [MainForm에서] UserControl속성 중 txtBox에 Control name을 입력함 이제 tbox는 메인폼의 Control으로 사용하면 됨 tBox.Text="123"; 하면 MainForm의 Control.Text="123" 에 입력됨. 사용자Control에 속성 만들기 txtBox라는 이름의 string Properties만들기 using System.Windows.Forms; namespace MyControl { public partial class myControl : UserControl { string tBox; // 속성 변수 Properties Value [Category("txtBox"), Description("explanation")] public TextBox txtBox { get { return tBox; } set { tBox = value; } } public myControl2Ex() { InitializeComponent(); } } //end Class } // end namespace 파일패스에서 파일명 얻기 filePath = saveFileDialog.FileName; string FileName= filePath.Substring(filePath.LastIndexOf('\\') + 1); // 파일경로에서 마지막 '\'의 Index를 구한 후 Index이후의 문자열 가져오면 순수 파일명 openFileDialog 사용시는 다음을 사용해도 됨 string FileName=openFileDialog.SafeFileName; 현재작업디렉토리 openFileDialog.InitialDirectory = Application.StartupPath; DataGridView 선택 Row Index 얻기 DataGridView의 Index 얻는법 DataGridView Control Name : dataGrid int index=dataGrid.SelectedRows[0].Index; // Row가 아니고 Row[0]인 이유는 MultiSelect도 사용할 수 있기 때문이다. Index를 설정 하는 법 dataGrid.CurrentCell = dataGrid.Rows[rowIndex].Cells[0]; // row에는 속성이 없고 Cells에만 있음 DataGridView에 Row Index 표시하기 dataGrid _RowPostPaint event함수 사용 그냥 복사해서 사용하면 됨 ( 사각형그리고 인덱스 숫자 그리고...) private void dataGrid_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e) { Rectangle rect = new Rectangle(e.RowBounds.Location.X, e.RowBounds.Location.Y, dataGrid.RowHeadersWidth - 4, e.RowBounds.Height); TextRenderer.DrawText(e.Graphics, (e.RowIndex).ToString(), dataGrid.RowHeadersDefaultCellStyle.Font, rect,.. DataGridView Header 속성 편집 폼 로드시.... foreach (DataGridViewColumn column in dataGrid.Columns) { column.SortMode = DataGridViewColumnSortMode.NotSortable; // 자동 Sort설정 OFF column.HeaderCell.Style.Alignment= DataGridViewContentAlignment.MiddleCenter; // 핃드명 칸 column.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; // 자료표시 칸 } 사용자정의 Control 에 있는 내부 컨트롤의 event 받기(1) UserControl은 버튼2개로 구성했습니다. 이 버튼을 클릭하면 메인폼의 TextBox에 글을 세팅합니다. https://youtu.be/1y_myHJptB8 UserControl의 버튼 속성중 Modifiers를 Public으로 하세요. 그러면 UserControl에서 할일은 끝 2) 메인폼은 다음의 소스코드를 보면 이해 하실듯 UserControl Name : myControl using System; using System.Windows.Forms; namespace WindowsFormsApp1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void myButton1_Click(obj.. C# 2진 파일 입출력 BinaryFile static void Main(string[] args) { BinaryWriter bw = new BinaryWriter(new FileStream("binary_test.txt", FileMode.Create)) bw.Write(32); bw.Write(3.14f); bw.Write("한글"); bw.Close(); // BinaryReader br = new BinaryReader(new FileStream("binary_test.txt", FileMode.Open))) BinaryReader br = new BinaryReader( File.Open("binary_test.txt",FileMode.Open)) int i=br.ReadInt32(); float f=br.ReadSingle(); st.. C# 텍스트파일 입출력 Text File static void Main(string[] args) { // FileStream fs = new FileStream("test.txt", FileMode.Create); // StreamWriter sw = new StreamWriter(fs); // 2단계로 생성 two-phase generation StreamWriter sw = new StreamWriter("test.txt"); // 1단계로 생성 one-phase generation sw.WriteLine(1); sw.WriteLine("한글"); sw.WriteLine("{0:X}",0x0f); sw.Close(); // fs = new FileStream("test.txt", FileMode.Open); StreamReader sr=n.. 가변길이 매개변수 namespace ConsoleApp1 { internal class Program { private int Sum(params int[] args) { int s = 0; // for (int i = 0; i < args.Length; i++) s += args[i]; s=args.Sum(); return(s); } static void Main() { Console.WriteLine(Sum(1, 2, 3)); Console.WriteLine(Sum(1, 2)); } } //end Programs } // end namespace Console Result 6 3 C# 조건연산자 ? int a=0; 변수 = 조건식 ? true일때 : false일때 string result = a==30 ? "참일때" :"거짓일때"; result는 "거짓일때"임 C# enum 열거형 인덱스 enum 열거형식명 (:자료형) { A,B,C,D,E,F} // 0, 1, 2, 3, 4, 5 { A=10,B,C,D,E,F=90} // 10,11,12,13,14,90 C# 숫자를 문자열로 변환하기 int a = 12345; float b = 123.45; int c = 200; string s1=a.ToString(); string s2=b.ToString(); string s3.=a.ToString ("X"); ; 16진수표기로 변환(X2 두자리 결과 Result s1 "12345" s2 "123.45" s3 " C8 " C# 문자를 숫자로 변환하기 Parse() 또는 Convert()를 사용 // 십진수 문자열 int a1= int.Parse("1234"); // 16진수 문자열 hexadecimal string int a2= int.Parse("1F", System.Globalization.NumberStyles.HexNumber); int a2=Convert.ToInt32("12345";) double b2=Convert.ToIntDouble("123.45"); 이전 1 2 다음