C#2020. 9. 4. 09:29

C#에서 Class를 Dictinonary Key로 사용하는 방법에 대해서 정리를 했다.

 

Dictionary<Class1, Class2> dict = new  Dictionary<Class1, Class2>();

 

 

 

* 위와 같이 Class1을 Key로 사용할려면

public class Class1

{

    public string Value1 { get; set; }

    public int Value2 { get; set; }

 

    public override int GetHashCode()

    {

         return Value1.GetHashCode() + Value2.GetHashCode();

    }

 

    public override bool Equals(object obj)

    {

        Class1 o = obj as Class1;

        return o != null && (o.Value1 == this.Value1 || o.Value2 == this.Value2); 

    }

}

 

- Dictionary에서 Key를 Class로 사용하기 위해서는

 

Key에 해당하는 Class에 GetHashCode()와 Equals(object)를 재정의 해줘야 한다.

 

 

* 사용법 

 

Dictionary<Class1, Class2> dict = new  Dictionary<Class1, Class2>();

 

dict.Add(new Class1() { Value1 = "My Value", Value2 = 1 }, new Class2() {....} );

dict.Add(new Class1() { Value1 = "My Value", Value2 = 2 }, new Class2() {....} );

 

- 위와 같은 형식으로 Dictionary Class를 Key로 사용할 수 있다.

 

 

Class2 c = dict[new Class1() { Value1 = "My Value", Value2 = 1 }] ;

 

dict[new Class1() { Value1 = "My Value", Value2 = 1 }] = new Class2() {...} ;

 

- 위와 같은 형식으로 Dictionary Value를 읽어오고 저장할 수 도 있다.

 

 

Posted by kongzz
C#2017. 11. 8. 15:25

C#의 ToolStripButton 에 Popup 메뉴를 띄워보기 위해서 찾다가 알게 된 내용을 정리하였습니다.

 

 

저장 버튼에 마우스 우클릭시에 위와 같은 Popup 메뉴를 보이게 하기 위하여,

 

해당 ToolStripButton 의 우클릭 이벤트에 아래와 같이

 

ContextMenu에 MenuItem 을 등록하고 Show를 하면 된다.

 

Show에서 마우스 포인터에 Popup Menu를 표시하기 위해서 고생을 했다.

 

 

Posted by kongzz
C#2016. 11. 23. 11:03

 

C#의 TabControl을 사용하다가 TabPage에 닫기 버튼을 넣고 싶었다.

TabPage라는 단어로 검색을 했더니 TabControl 에서 처리해야 된다는 걸 알게 되었다.

 

TabControl 의 TabPage 에 닫기 버튼을 추가하는 방법에 대한 내용을 정리했다.

 

 

우선 TabControl을 상속을 받는다.

그리고 생성자에서 DrawMode를 OwnerDrawFixed로 해줘야 한다.

 

     public class ucTabControl : TabControl
    {
        private Point _imageLocation = new Point(18, 5);
        private Point _imgHitArea = new Point(15, 3);


        public ucTabControl()
        {
            this.DrawMode = TabDrawMode.OwnerDrawFixed;
        }

 

닫기 버튼에 대한 이미지는 2개를 만들어서 Resource에 만들어 놓았다.

 

하나는 선택된 TabPage의 닫기 버튼을 위한 이미지이며,

다른 하나의 나머지 다른 TabPage의 닫기 버튼을 위한 이미지이다.

 

        protected override void OnDrawItem(DrawItemEventArgs e)
        {
            base.OnDrawItem(e);

 

            try
            {
                Image img;          

                Font f = this.Font;

                Rectangle r = e.Bounds;
                Brush titleBrush = new SolidBrush(Color.Black);
                string title = this.TabPages[e.Index].Text;

 

                r = this.GetTabRect(e.Index);
                r.Offset(2, 2);

 

                // SelectedTab의 Background Color 는 White으로 처리
                if(this.SelectedIndex == e.Index)
                    e.Graphics.FillRectangle(new SolidBrush(Color.White), e.Bounds);

 

                // 각 Tab별로 close button 에 대한 image값 
                if (this.SelectedTab == this.TabPages[e.Index])
                    img = Properties.Resources.Close_BWhite;
                else
                    img = Properties.Resources.Close_BGray;

 

                // TabPage Text
                e.Graphics.DrawString(title, f, titleBrush, new PointF(r.X, r.Y));


                // TabPage 의 닫기 버튼
                e.Graphics.DrawImage(img, new Point(r.X + this.GetTabRect(e.Index).Width - _imageLocation.X, _imageLocation.Y));

                img.Dispose();
                img = null;               
            }


            catch (Exception)
            {
            }
        }

 

 

OnDrawItem 메소드 하나만 override 하면 TabPage 별로 닫기 버튼 넣기가 처리가 된다.

 

아래의 그림에서 보면 SelectTab의 닫기버튼은 다른 TabPage 와 배경색이 구분된다.

 

 

 

그런데 문제는 TabControl을 사용해보면 처음 두개의 TabPage 처럼  TabPage Text 와 닫기 버튼이 중첩되어 버린다.

 

this.ucTabControl1.TabPages.Add("New Page3  "); 

 

위와 같은 TabPage 추가시 Text에 공백2개 정도을 추가하면 닫기 버튼 중첩을 회피 할 수는 있다.

 

 

* 위의 내용은 구글 검색중에서 알게 된 내용을 정리하였으며, 출처는 모르겠음.

Posted by kongzz
C#2016. 6. 24. 12:02

C#에서 ADO를 이용하여 Excel 화일 생성하는 기능에 대해서 공부한 내용을 정리를 한 자료입니다.

 

 

1.Connection String 만들기

 

- 확장자가 xls인지 xlsx인지에 따라 Connection String 이 달라진다.

 

 

 

- 해당 Provider의 존재 여부를 레지스트리에서 확인 할 수가 있다.

 

 

 

 

2. DataGridView에 있는 데이터를 Excel 생성하는 예제.

 

 

- CREATE 문 생성시 특이사항.

  NAME, ADDR 은 VARCHAR로 생성하였고,
  MEMO 는 MEMO로 생성하였다.

  VARCHAR은 255byte 의 제약이 있다.

  MEMO 의 제약은 얼마인지는 모르겠다.

 

 

 

- 이렇게 호출하면 Excel이 설치되지 않은 컴에서도 Excel화일이 생성된다.

Posted by kongzz
C#2015. 7. 25. 13:43

 

C#으로 만든 Oracle Database 조회 프로그램입니다.

toad의 Schema Browser 같은 화면을 만들어 보았습니다. 


 

- 개발환경:

Visual Studio 2015

.Net Framework 2

Oracle 32bit 접속 환경

실행화일은 500K 미만의 작은 소형 프로그램입니다.

 

Windows XP에서는 .Net Framework 2를 설치후 사용 가능하며,

Widows 7이상의 환경에서는 .Net Framework 2가 기본으로 있어서

 오라클Client 가 설치된 환경에서는 실행 화일 하나만으로 실행이 가능합니다.

 

 

- 아래와 같은 기능들이 있습니다.

 

 [쿼리 조회 기능]

 F1 키를 이용하면 몇가지 기능에 대한 Help를 볼 수 있습니다.

 


[Schema Browser]

 

 

[Tablespace Viewer]

 


 

 

 * 첨부화일

DBViewer.exe
0.46MB

Posted by kongzz