프로그래밍
2021. 08. 07. 22:10
[C#] 예전에 정리해둔게 있길래 일단 한번 작성

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 로 설정한다.

 

 

태그 #C# #mytips
댓글
관련문서