본문 바로가기

Tip !!!/C# tip

(33)
배열 늘리기 Array.Resize( ref 배열이름 , 새로운 크기 ); using System; namespace ConsoleApp2 { internal class Program { public struct Font { public string s; public short[] f; } static void Main(string[] args) { Font[] font = new Font[1]; 방 1칸 font[0].s = "한"; font[0].f = new short[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; Array.Resize(ref font, 2); 방 2칸 Font f = new Font("국", new short[] { 0, 1, 2, 3 }); font[1] = f; Cons..
DataGridView의 Row 갯수는? DataGridView의 Row 갯수는? DataGrid이름.Rows.Count 가 아님 DataGrid이름.Rows.Count - 1 이에요. 마지막 입력이 안된 null Row를 포함한 갯수라 -1해야 실제 갯수입니다. 그리고 마지막 Row의 인덱스는 DataGrid이름.Rows.Count -2 입니다 if ( dataGrid.Selected.Rows[0].index == dataGrid.Rows.Count -2 ) 선택된 Row가 마지막 Row인가?
검색결과 레코드(Row) DataGrid에 모우기 위의 그림처럼 검색에 해당하는 Row를 모아 DataGridView에 보여주기 DataTable과 연결된DataGridView는 프로그램 코드로 삽입,삭제를 못한다. 그래서 Table에 직접 해야 한다. 우선 Table 복사판을 만들고 일치 히지 않는 Row를 제거한후 DataGrid와 복사본을 연결 시키면 일치하는 Row만 있는 화면을 볼수 있다. 꼭 복사판에 작업해야 원본이 보존된다. private void btSerch_Click(object sender, EventArgs e) { if (txtSerch.Text == "") return; // 빈값이면 return int rowIndex = 0; // Row Index 첫번째 Row DataTable tempDt= new DataTable(); ..
Table에 연결된 DataGridView Row 이동방법 바운딩된 DataGrid는 삭제 삽입이 안됩니다. 그래서 Table에서 삭제 삽입을 해야 합니다. 그러면 바로 DataGridView에도 반영됩니다. 다음의 코드는 Row를 위로 아래로 이동 시키는 코드 예입니다. public partial class Form1 : Form { DataSet ds; // 작업 DataSet DataTable dt; // 작업 Data Table // DataGridView의 이름 dataGrid private void btUp_Click(object sender, EventArgs e) { int index = dataGrid.SelectedRows[0].Index; // 선택된 Row의 인덱스 if (index dataGrid.Rows.Count-2) return; /..
DataGridView에서 선택된 Cell 처리 private void dataGrid_CellContentClick(object sender, DataGridViewCellEventArgs e) { txtSerch.Text = dataGrid.SelectedCells[e.ColumnIndex].Value.ToString(); }
폼 닫기 취소 시키기 form closing cancel 폼닫기 버튼,메뉴 등등으로 form closing 될때 취소 시키는 법 private void frmMain_FormClosing(object sender, FormClosingEventArgs e) { FormYesNo frm = new FormYesNo(); DialogResult re = frm.ShowDialog(); if (re == DialogResult.Cancel) e.Cancel = true;// Closing 취소시키고 return // 아래문 실행 안됨 if (re == DialogResult.Yes) btSave_Click(null, null); // 저장하기 }//func
리치텍스트박스 RichTextBox에서 행 단위로 색깔 바꾸기 리치텍스트박스.SelectionColor = Color.Yellow; 리치텍스트박스.AppendText("텍스트 내용" + "\r\n");
멀티 텍스트박스 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는 "거짓일때"임