퇴근5분전

가상메서드와 오버라이드 관계를 알아보기 위해 예제로 만들었음.

그닥.. 설명할게 없으므로... 설명은 패쓰~



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace Virture_Override
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            SuperClass s = new _BabyBabyOne(this.textBox1.AppendText);
            s.Print();
        }
    }


    public class SuperClass
    {
        public SuperClass( _Print p)
        {
            prt = p;
        }

        public delegate void _Print(string text);

        protected _Print prt = null;

        public virtual void Print()
        {
            prt("SuperClass :\t public virtual void Print() " + Environment.NewLine);
        }
    }

    public class _BabyOne : SuperClass
    {
        public _BabyOne(_Print p )
            : base(p)
        {
        }

        public override void Print()
        {
            base.Print();
            prt(" _BabyOne :\t public override void Print() " + Environment.NewLine);
        }
    }

    public class _BabyBabyOne : _BabyOne
    {
        public _BabyBabyOne(_Print p)
            : base(p)
        {
        }

        public override void Print()
        {
            base.Print();
            prt(" _BabyBabyOne :\t public override void Print() " + Environment.NewLine);           
        }
    }
}

그리드뷰 각 Row색 바꾸기.
사용자 삽입 이미지
<그리드뷰에 무지개색을 입힌 모습 >

기본적으로 기본스타일 + 홀수행 스타일 바꾸면 홀짝 홀짝 ... 색조절은 가능하다.

특정열에 어떤 값에 따라 Row에 표시하고자 할때 사용하기위해 만들다가
그냥 블로깅 해둔다.
예제로 무지개색를 넣었음.


 public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
           
            DataTable dt = new DataTable();
            dt.Columns.AddRange(new DataColumn[] {
                new DataColumn("NO"),  // 열값에 따라 색을 바꾸고자..
                new DataColumn("NAME"),
                new DataColumn("REMARK")           
            });

            for (int loop = 0; loop < 21; loop++)
                dt.Rows.Add(loop, string.Format("{0} NAME", loop), loop % 3 == 0 ? "비고~" : " NONE ");

            dataGridView1.DataSource = dt;

        }

        private void dataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
        {
            try
            {
                int no = Convert.ToInt32(dataGridView1["NO", e.RowIndex].Value);
                switch (no % 7) // 7가지 색을 넣기위해..
                {
                    case 0:
                        dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Red;
                        break;
                    case 1:
                        dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Orange;
                        break;
                    case 2:
                        dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Yellow;
                        break;
                    case 3:
                        dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Green;
                        break;
                    case 4:
                        dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Blue;
                        break;
                    case 5:
                        dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.DarkBlue;
                        break;
                    case 6:
                        dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Violet;
                        break;                 
                    default:
                        dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Empty;
                        break;
                }
            }
            catch
            {
           
            }
        }
    }


!! 참~~ 쉽당~




<< FadeIn 효과를 적용한 폼 실행파일 >>


폼을 Show하면 생뚱맞게 툭 튀어나는걸
부드럽게 살짝 뒤에서 앞으로 나오는듯이? 투명에서 불투명수치를 조정하면서 튀어나오는 효과를
만들어보았다.

Form에 Shown 이벤트에 걸어주면 됨.
     protected override void OnShown(EventArgs e)
        {
            base.OnShown(e);
            FormEffect(this);
        }


// 이 메서드를 이용하게 된다.
 private void FormEffect(Form fm)
        {
            double[] opacity = new double[] { 0.1d, 0.3d, 0.7d, 0.8d, 0.9d, 1.0d};
            int cnt = 0;
            System.Windows.Forms.Timer tm = new System.Windows.Forms.Timer();
            {
                fm.RightToLeftLayout = false;
                fm.Opacity = 0d;                
             tm.Interval = 70;   // 나타나는 속도를 조정함.          
                tm.Tick += delegate(object obj, EventArgs e)
                {                   
                    if (( cnt +1 > opacity.Length) || fm == null)
                    {
                        tm.Stop();
                        tm.Dispose();
                        tm = null;
                        return;
                    }
                    else
                    {
                        fm.Opacity = opacity[cnt++];
                    }
                };                                  
                 tm.Start();               
            }         
        }

ps: 음 플젝에 적용해봤는데 MDI 부모창은 적용이 되는데 Mdi 자식창은 적용이 안되는것이...
쬐끔 아쉬웠던...

'# 2) .Net ( Vs 2005 ) > WinForm' 카테고리의 다른 글

가상메서드 - 오버라이드...  (0) 2009.10.06
그리드뷰 각 Row색 바꾸기.  (1) 2009.09.25
XmlHelper 를 만들다.  (0) 2009.09.23
TextBox 페인트 이벤트 걸기.  (2) 2009.08.24
ControlPaint 객체..  (0) 2009.08.20

xml을 일일이 파싱하고 잘라내는데 사용하는 여러가지 방법을 사용하던중
헬퍼를 만들어서 사용하고자 뚝딱... 만들었음.

예전 사용방법은 XmlDocument 를 이용하여 xml파일을 읽어들이고
XmlElement와 XmlAttribute를 이용해서 조작했으나 너무 번거롭고 소스도 지저분해짐.

해서 아래와 같은 헬퍼클래스를 만들어 사용함.

주의!   이건 순수 xml구조로 파일을 만들어내고 xsd같은 스키마 형태는 지원되지 않으므로 사용상 주의!!


Xml 파일 로딩 방법.

XmlHelper.XmlHelperClass xdoc = new XmlHelper.XmlHelperClass(@"C:\Documents and Settings\MyHome\My Documents\Visual Studio 2005\Projects\MyControl\MenuXml.xml");
            this.textBox1.Text = xdoc.ToXml();

--> Xml 생성방법.

XmlHelper.XmlHelperClass xdoc = new XmlHelper.XmlHelperClass();

            xdoc.Root_XmlElmt = new XmlHelper.XmlElmt("Root"); // 처음 Element 생성

            XmlHelper.XmlElmt e1 = new XmlHelper.XmlElmt("E1");
            e1.Att_Add("att1_Name", "att1_Value");
            xdoc.Root_XmlElmt.ElmtAdd(e1); // Depth처리로... 순서를 맞춰주면 좋음

            XmlHelper.XmlElmt e2 = new XmlHelper.XmlElmt("E2");
            e2.Att_Add("att2_Name", "att2_Value");

            e1.ElmtAdd(e2);

            XmlHelper.XmlElmt e3 = new XmlHelper.XmlElmt("E3");
            e3.Att_Add("att3_Name", "att3_Value");

            e2.ElmtAdd(e3);

            XmlHelper.XmlElmt e4 = new XmlHelper.XmlElmt("E4");
            e4.Att_Add("att4_Name", "att4_Value");

            e3.ElmtAdd(e4);

            XmlHelper.XmlElmt e5 = new XmlHelper.XmlElmt("E5");
            e5.Att_Add("att5_Name", "att5_Value");
            e5.Att_Add("att5a_Name", "att5a_Value");

            e1.ElmtAdd(e5);


            // xml 파일로 저장
            xdoc.Save(@"C:\Documents and Settings\MyHome\My Documents\Visual Studio 2005\Projects\MyControl\OpenXml\OpenXml\xml_Folder\ttt.xml");

            this.textBox1.Text = xdoc.ToXml();

// xdoc.Root_XmlElmt["E1"] 로 해당 엘리먼트를 뽑아낼수 있음.
// XmlElmt[] 로 반환되므로... 하위 엘리먼트까지 뽑아낼수 있음.


-- 결과 ---------------------------------------------------------------------------
<?xml version="1.0" encoding="utf-8"?>
<Root>
    <E1 att1_Name="att1_Value">
        <E2 att2_Name="att2_Value">
            <E3 att3_Name="att3_Value">
                <E4 att4_Name="att4_Value">
                </E4>
            </E3>
        </E2>
        <E5 att5_Name="att5_Value" att5a_Name="att5a_Value">
        </E5>
    </E1>
</Root>

----------------------------------------------------------------------------------
<dll 파일 >

- Att_Add  : 속성 추가
- ElmtAdd : 엘리먼트 추가
- Save : 저장
- Load : 생성자를 통해 적용됨.( private 속성임 )

* 참고 : depth표현을 하고자 depth속성을 이용하는데 엘리먼트 추가시 자신의 depth를 조정받게 됨.
 ex ) A.ElmtAdd( B ); 
       A가 0이면 B가 1이 됨.   A가 3 이면 B가 4가됨.
      ToXml() 호출시 tab 문자가 뎁스만큼 붙어서 출력됨.



--> 2010년 3월 14일 추가사항..

Plugin 리스트 관리를 xml로 만들면서 사용하니 Attribute 뽑는것을 잊고 있었다.. 하여
GetAtt( string AttName )을 추가하였다.





텍스박스에 Paint 를 재정의 하고 싶을때 아래와 같이 재정의해서 생성자에 한줄 넣어주면
OnPaint를 쓸수가 있게 된다.

    public class TTB : TextBox
    {
        public TTB()
        {
            base.SetStyle(ControlStyles.UserPaint, true);          
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
        }
    }


'# 2) .Net ( Vs 2005 ) > WinForm' 카테고리의 다른 글

Win Form이 스윽~~ 나오는 효과내기  (0) 2009.09.23
XmlHelper 를 만들다.  (0) 2009.09.23
ControlPaint 객체..  (0) 2009.08.20
TextBox에 드래그앤드랍 구현하기.!  (0) 2009.08.20
ErrorProvider 라는게 있음.  (0) 2009.08.18

컨트롤 페인트라는게 있어서 의외로 다른 작업들이 가능해짐.
ControlPaint


ControlPaint.DrawBorder3D(e.Graphics, panel1.DisplayRectangle, Border3DStyle.Etched );
ControlPaint.DrawGrid(e.Graphics, panel1.DisplayRectangle, new Size(10, 10), Color.Blue);
ControlPaint.DrawRadioButton(e.Graphics, new Rectangle(10,10,10,10) , ButtonState.Checked);
ControlPaint.DrawSizeGrip(e.Graphics, Color.Red, new Rectangle(panel1.Width - 10, panel1.Height -10 ,10,10));

보더, 그리드, 라디오버튼그림, 사이즈그립표시 가 아래 적용된것이고 더 많이 있음.

적용한 이미지는 아래 참조.

사용자 삽입 이미지


판넬에 그룹박스처럼 외곽 보더를 바꾸고자 할때 사용할 수 있음.



참고 :
        TextboxRender 라는게 있고... ComboBoxRender도 있고...
지원되는게 더있드라... 찾아봐야징...


       

드래그앤드롭 구현인데

SQL Management 처럼

테이블 트리에서 -> 에디터폼에 목록 드래그시 Text 마우스 커서 위치에
데이타 넣는 처리.

훈스에서 어떤 분이 질문한거 잠깐 구현해서 넣었음.
이를 글로 적어둠.

TextBox에 드래그오버시 Textbox에 캐럿을 마우스현위치로 이동시키는 처리가 필요했음.
GetPositionFromCharIndex  과
GetCharIndexFromPosition  로 처리가 가능해짐.



 textBox.ArrowDrop = true;

   private void button3_MouseDown(object sender, MouseEventArgs e)
        {
            textBox1.DoDragDrop(button3.Text, DragDropEffects.All);
        }

        private void textBox1_DragEnter(object sender, DragEventArgs e)
        {
            textBox1.Focus();
            e.Effect = e.AllowedEffect;           
        }

        private void textBox1_DragOver(object sender, DragEventArgs e)
        {                      
            if ((textBox1.PointToClient(new Point(e.X, e.Y)).X ) > textBox1.GetPositionFromCharIndex(this.textBox1.TextLength - 1).X)
            {
                this.textBox1.SelectionStart = this.textBox1.TextLength;
            }
            else
            {
                textBox1.SelectionStart = textBox1.GetCharIndexFromPosition(textBox1.PointToClient(new Point(e.X, e.Y)));
            }
        }

        private void textBox1_DragDrop(object sender, DragEventArgs e)
        {          
            this.textBox1.Paste(e.Data.GetData( typeof(string)).ToString());
        }

사용자 삽입 이미지
 << ErrorProvider 가 적용된 폼 ( 우측 ! 마크 ) >>                  

에러 대한 처리 표시를 쉽게 구현할수 있음.
http://msdn.microsoft.com/ko-kr/library/system.windows.forms.errorprovider_members(VS.80).aspx
자세한것은 msnd ㅎㅎ..


ErrorProvider er = null;

생성자orLoadEvent ( )
{
     er = new ErrorProvider(this); // this 처리된것은 컨테이너를 인자값으로 취함.
}

private void textBox1_Validated(object sender, EventArgs e)
        {
            if (textBox1.Modified)
            {
                try
                {
                    er.Clear();
                    checked
                    {
                        int i = Convert.ToInt32(textBox1.Text);
                    }                   
                }
                catch
                {
                    er.SetIconAlignment(textBox1, ErrorIconAlignment.MiddleRight);
                 er.SetError(textBox1, "에러:숫자가 아님");
                }
            }
        }

'# 2) .Net ( Vs 2005 ) > WinForm' 카테고리의 다른 글

ControlPaint 객체..  (0) 2009.08.20
TextBox에 드래그앤드랍 구현하기.!  (0) 2009.08.20
바인딩네비게이터와 프로퍼티그리드 연결  (0) 2009.08.18
바인딩 네비게이터  (0) 2009.08.14
WaitCursor ...  (0) 2009.08.14

사용자 삽입 이미지

<< 바인딩 네비게이터와 프로퍼티 그리드를 바인딩 시킨것임. >>


이전에 데이타 바인딩 네비게이터를 이용한 소스에서
프로퍼티 그리드를 추가 해보았음.

 프로퍼티 그리드에 직접적인 바인딩 후 포지션 변경은 조금 에러가 떨어지다보니
찾은 방법(노가다)이 바인딩 객체를 이용하는것이었음.


 DataTable에 DB에서 가져온 데이타를 프로퍼티 그리드에서 변환 없이 볼수 있게됨.

근데 이걸 어따 써먹쥐?!!!



소스는 아래와 같음.

        private void Form1_Load(object sender, EventArgs e)
        {
            // TODO: 이 코드는 데이터를 'catholic_artDataSet.ITEM' 테이블에 로드합니다. 필요한 경우 이 코드를 이동하거나 제거할 수 있습니다.
       
            SqlConnection sql = new SqlConnection(" ... ");
            SqlCommand scmd = sql.CreateCommand();
            scmd.CommandText = "select * from Item(Nolock)";
            sql.Open();              
            DataTable dt = new DataTable();
            dt.Load(scmd.ExecuteReader( CommandBehavior.SequentialAccess ));
            sql.Close();

            this.bindingSource1.DataSource = dt;
            this.bindingNavigator1.BindingSource = this.bindingSource1;

            this.textBox1.DataBindings.Add("Text", this.bindingSource1, "ICODE", true);
            this.textBox2.DataBindings.Add("Text", this.bindingSource1, "KNAME", true);

            Binding b = new Binding("SelectedObject", bindingSource1,"", true, DataSourceUpdateMode.OnPropertyChanged);
            propertyGrid1.DataBindings.Add(b);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            propertyGrid1.BindingContext[bindingSource1].Position--;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            propertyGrid1.BindingContext[bindingSource1].Position++;       
        }
      

PS :

데이타 그리드뷰를 붙여봤는데

이때 데이타 그리드 뷰와 프로퍼티 그리드가 같이 적용되는것을 확인하였다.

전에 프로젝트를 만들때 그리드뷰에 선택된 행을 동적 클래스로 바꾸어 프로퍼티그리드에 넣었던 일들이

지금엔 삽질처럼 느껴졌다.



'# 2) .Net ( Vs 2005 ) > WinForm' 카테고리의 다른 글

TextBox에 드래그앤드랍 구현하기.!  (0) 2009.08.20
ErrorProvider 라는게 있음.  (0) 2009.08.18
바인딩 네비게이터  (0) 2009.08.14
WaitCursor ...  (0) 2009.08.14
데이타 그리드 뷰 헤더 이용하기.  (2) 2009.08.06

사용자 삽입 이미지

<< 캡쳐 >>



바인딩 거는 소스 처리부..

            SqlConnection sql = new SqlConnection(" ... ");
            SqlCommand scmd = sql.CreateCommand();
            scmd.CommandText = "select * from Item(Nolock)";
            sql.Open();              
            DataTable dt = new DataTable();
            dt.Load(scmd.ExecuteReader( CommandBehavior.SequentialAccess ));
            sql.Close();
           

            this.bindingSource1.DataSource = dt;
            this.bindingNavigator1.BindingSource = this.bindingSource1;

            this.textBox1.DataBindings.Add("Text", this.bindingSource1, "ICODE", true);
            this.textBox2.DataBindings.Add("Text", this.bindingSource1, "KNAME", true);


음 이걸 어떻게 응용할수 있을까???