C# 을 이용해서 Windows Application 개발할때 유용하게 써먹던것들 정리된게 있어서
게시물 작성해서 정리 한번 해본다.
솔직히 너무 오래되서 이게 뭘 의미하는건지도 모르겠는데, 언젠가 막혔을때 이걸 보면 막힌게 풀리지 않을까 하는 기대감에 계속 남겨뒀던것같다
1. 작업이 진행중인 경우에도 멈추지 않고 폼이 작동하도록 처리
Application.DoEvents();
를 사용하면 할 수 있다.
2. ListView 에서 현재 화면에 보이는 ListViewItem 을 구하는 방법 ( LargeIcon 이상에서 )
VisibleItems = new List<ListViewItem>();
for ( int i = 0; i < Items.Count; i++ )
{
int ItemXStrt = Items[i].Bounds.X;
int ItemYStrt = Items[i].Bounds.Y;
int ItemXEnd = Items[i].Bounds.Width + ItemXStrt;
int ItemYEnd = Items[i].Bounds.Height + ItemYStrt;
if ( 0 < ItemXEnd && 0 < ItemYEnd && ItemXStrt < this.Width && ItemYStrt < this.Height )
{
VisibleItems.Add( Items[i] );
}
}
3. Application Closing Event 를 컨트롤 하려면
1. Program.cs 에서 Application.Run() 으로 시작한 Form 을 찾는다.
2. 해당 Form 의 Closing Event 를 지정
3. 조건처리후 EventArgs 에 Cancel 변수를 true 로 지정한다. ( e.cancel = true; )
4. Moves : List<FileInfo> || 리스트 내에서 sorting 을 Linq 를 사용하여 하는 방법
Moves = Moves.Select(x => x).OrderBy( f => f.Length ).Reverse().ToList();
5. BackgroundWorker
this.ImageWorker.WorkerReportsProgress = true;
this.ImageWorker.WorkerSupportsCancellation = true;
this.ImageWorker.ProgressChanged += new ProgressChangedEventHandler( ImageWorker_ProgressChanged );
this.ImageWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler( ImageWorker_RunWorkerCompleted );
this.ImageWorker.DoWork += new DoWorkEventHandler( ImageWorker_DoWork );
6. WebBrowser 에서 Alert 를 막는방법
private void InjectAlertBlocker(WebBrowser browser)
{
HtmlElement head = browser.Document.GetElementsByTagName( "head" )[0];
HtmlElement scriptEl = browser.Document.CreateElement( "script" );
string alertBlocker = "window.alert = function () { }";
scriptEl.SetAttribute( "text", alertBlocker );
head.AppendChild( scriptEl );
Console.WriteLine( "InjectAlertBlocker Worked : Target => " + browser.Name );
}
(WinForm 의 WebBrowser 였던거같다)
상단 코드에서
string alertBlocker = "window.alert = function (message) { external.log(message); }";
로 alertBlocker 를 변경하고
[ComVisible( true )]
public class Logger
{
private WebBrowser m_Browser;
private WebBrowser m_Browser;
public WebBrowser Browser { get => m_Browser; set => m_Browser = value ; }
public Logger(WebBrowser browser)
{
Browser = browser;
}
public void log( string s )
{
// WebBrowser 의 Console.Log 를 External.Log 방식으로 가져왔음.
// 여기서부터 내역 처리가 가능할것임
Console.WriteLine( "Logger => " + s );
}
}
를 사용하여 Console WIndow 에 메세지를 뿌려줄 수 있다. Browser 컨트롤도 가능하다.
7. Thread 에 Join 을 걸어 Timeout 체크하는 방법
Thread ReadAssist = new Thread( (ThreadStart)( () => temp = this.ReadLine( Reader ) ) );
ReadAssist.Start();
if (ReadAssist.Join(TimeSpan.FromSeconds(5)))
{
///Do Something
}
또한 Thread 에 Variable = Value 형식으로 ( temp = this.ReadLine(Reader) ) 데이터를 넣는것도 가능하다.
8. Installer 에 필요한 프로그램 확인 로직 추가하기
1. Installer -> View -> 시작조건 을 연다.
2. Search Target Machine 에 해당 조건을 추가한다.
- 조건에는 파일 또는 폴더 감지 / 레지스트리 감지 2가지 기능을 주로 사용한다.
3. 해당 조건의 Property 값에는 띄어쓰기가 들어가지 않도록 해서 값을 잘 설정한다.
4. Launch Conditions 에 시작 조건을 추가한다.
5. 2~3에서 만들어둔 조건을 Condition 에 링크시킨다.
- 이때 링크에는 AND 또는 OR 조건이 먹힌다. ( 예 : AAA OR BBB )
6. Installer 를 패키징한다.
9. Thread 간섭이 없는 상황에서 CrossThreadException 이 뜨는경우
CheckForIllegalCrossThreadCalls = false;
10. NonStringByteArray 검출
Mysql 에서 String 등록을 진행할때 (varchar, text 등 ) 해당 바이트가 String 이 아니라는 에러가 나올때가 있음. Row Insert 시 String 을 보내지만, 받는 데이터가 Byte[] 라 이것을 String 으로 전환하면서 나는 에러
// 이 Result 에서 Byte[] 를 가져오는듯 보임
Result = JsonParser( sResultJson );
// 가져온 Byte[] => String 에서 정상적이지 않은 Char 를 삭제시켜주는 로직이 필요함
Result = new string( Result.Where( x => !char.IsSurrogate( x ) ).ToArray() );
이렇게 처리하고나면
DoQuery(String Query) 에서
cmd.ExecuteReader(); 가 더이상 Exception 을 던지지 않게됨
11. 스크롤이 있는 Parent Object 에서 가려진 Child Object 를 바로 보여주려고 한다면
child.BringIntoView();
를 사용하면 된다.
12. WPF 에서 글씨 흐림 관련 처리를 하려면 다음의 코드를 Constructor 에 처리한다.
SetValue(TextOptions.TextFormattingModeProperty, TextFormattingMode.Display);
13. FileDialog 처럼 폴더 선택 다이얼로그 생성하는방법
WindowsApiCodePack-Core
WindowsApiCodePack-Shell
2개 Nuget 에서 설치
이후
CommonOpenFileDialog 를 사용하고
이 Dialog 에서
IsFolderPicker 변수를 true 로 설정한다.