퇴근5분전

DB Select했던것을 좀더 추가해서 구성한다. 

목적 : DebugForm활용법.
         GridView 바인딩 및 표시설정 방법
         UniList 소개.

디버그 활성화!
   JsFW.DEBUG.DebugQueryForm.SetDebugAuthority();
디버그 비즈 등록
  base.ShowDebugWindow(tb, this); // 디버그 창에 호출전 디버그 등록! 

끝... 넘 쉬운가?
디버그 창 뜬모습을 볼까낭


디버그 윈폼에 보면 사용한 쿼리 와 우측엔 파라미터가 나온다. 
아래는 해당 쿼리와 파라미터로 결과를 다시 쿼리 할수 있다.

파라미터를 사용시.. 쿼리 합성을 통해 쿼리를 파라미터와 치환도 가능하다.
또. 쿼리할때마다 쌓인다!


그리드 뷰
기본 그리드 뷰를 래핑한클래스로 프레임웍 내 표준 데이타 UniList로 데이타 I/O를 적용한 것임.
아래 보면 데이타 바인딩을 하고
컬럼을 지정해서 변경할수 있다.

            DataSet ds =   tb.List(null);
            gridView1.Bind(ds.Tables[0]);
            using (JsFW.Win.Controls.GridView_ColumnAtt att = new GridView_ColumnAtt())
            {
                att.Add(new GridView_ColumnInfo("object_id", "ID", 100f, DataGridViewContentAlignment.MiddleCenter));
                att.Add(new GridView_ColumnInfo("name", "프로시져명", 400f, DataGridViewContentAlignment.MiddleCenter));
                att.Setting( gridView1.SetColumnAtt ); // 대리자 등록.
                gridView1.SetConfig(true, true);
            }

gridView1.SetConfig(true, true); // 그리드 읽기전용,   Numbering

** 체크박스가 추가된 그리드, 그리드 두개짜리를 TwoGridView 가 존재한다 ( 추후에.. )

선택된 Row데이타 뽑기

            UniList selectData = gridView1.DataParameters;
            Alert( selectData.ToString("@name") );
            selectData.Clear();
            selectData = null;

** @name은 데이타의 Key로써  쿼리 파라미터로 바로 변환 되도록 정한 규칙이다.



전체 소스!!

  public partial class Form1 : BaseForm
    {
        Table_1 tb = new Table_1();

        public Form1()
        {
            InitializeComponent();

            this.NotifyIcon = Resources.Icon1;
            this.NotifyIcon_Visible = true;
            this.NotifyIcon_Menu = new ContextMenu();
            this.NotifyIcon_Menu.MenuItems.Add(new MenuItem("종료하기", delegate { this.Close(); }));

            JsFW.DEBUG.DebugQueryForm.SetDebugAuthority();

            gridView1.UniGriView_Click_Delegage += new UniGridView_Click(gridView1_UniGriView_Click_Delegage);
        }

        void gridView1_UniGriView_Click_Delegage()
        {
            // 그리드 클릭시..

            UniList selectData = gridView1.DataParameters;
            Alert( selectData.ToString("@name") );
            selectData.Clear();
            selectData = null;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Alert("하이! ", 10);
        }

        protected override void OnUniButton_Click(object sender, JsFW_ButtonEventArgs e)
        {
            base.OnUniButton_Click(sender, e);

            switch (e.Code)
            {
                case Button_Codes.등록: break;
                case Button_Codes.닫기: break;
                case Button_Codes.Special :
                    switch (e.Special)
                    {
                        case Button_Codes_Special.SpecialBtn1: break;
                        case Button_Codes_Special.없다: break;
                    }
                    break;
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            base.ShowDebugWindow(tb, this); // 디버그 창에 호출전 디버그 등록!

            DataSet ds =   tb.List(null);
            gridView1.Bind(ds.Tables[0]);
            using (JsFW.Win.Controls.GridView_ColumnAtt att = new GridView_ColumnAtt())
            {
                att.Add(new GridView_ColumnInfo("object_id", "ID", 100f, DataGridViewContentAlignment.MiddleCenter));
                att.Add(new GridView_ColumnInfo("name", "프로시져명", 400f, DataGridViewContentAlignment.MiddleCenter));
                att.Setting( gridView1.SetColumnAtt ); // 대리자 등록.
                gridView1.SetConfig(true, true);
            }
        }
    }

    public class Table_1 : JsFW.ADONET.DataBase_Business
    {
        public override DataSet List(JsFW.BasicObjects.IUniDataParameter iDataPrms)
        {
            return ExcuteDataSet("Select * From sys.procedures", CommandType.Text, new System.Data.SqlClient.SqlParameter[0]);
        }
    }


BaseForm은 기본적인 폼 생성에 기초적인 몇가지를 미리 구현해두고 편리하게 사용하도록 만들어둔 Base객체임.

이외에 BaseUserControl도 있고... 등등...

지금은 BaseForm에 간단한 기능몇가지...

JsFW dll모음을 참조추가해주고

BaseForm을 상속 시켜주면

 우선 디자인뷰에서 속성창에 속성이 하나 나온다. 기존에 블로깅한 글에 하나에 있는데 초기 폼 위치결정을
UI로 할수 있도록 해주는 창이다.


처럼 하면 작업표시줄 위에 올라온다.


NotifyICon 사용하기...

public partial class Form1 : BaseForm
    {
        public Form1()
        {
            InitializeComponent();

          this.NotifyIcon = Resources.Icon1;
         this.NotifyIcon_Visible = true;
         this.NotifyIcon_Menu = new ContextMenu();
         this.NotifyIcon_Menu.MenuItems.Add(
                                    new MenuItem("종료하기", delegate { this.Close(); }));
        }
    }

간단히 ICon을 추가해놓고...  위처럼 간단히 넣어주면 된다.



실행결과는 위에 처럼 나온다. Js빨간 아이콘이 NotifyIcon을 적용한것이다. 우측버튼 클릭하면 등록한데로
종료하기가 나타난다.

그이외에도 BaseForm에는 몇가지 추가된 요소가 더있는데 기억이 ㅠㅠ;

컨트롤 추가하고 이 이벤트를 한곳에 모아놓기 위한 이벤트 핸들이라든가... 몇가지 있긴 한데...

아참 메세지 박스...  로그남기는 메서드등...등.. 있긴한데..

메세지 박스...

Alert(); 메서드인데... Alert <-- 웹할때 너무 익숙해져서... 훗!




 그냥 Alert창..



타이머 가동된 Alert    10초후 자동으로 닫힌다.  우측 숫자가 카운트...




        public static bool UsedLogging { get; set; }
        public void Alert(BaseException bEx);
        public virtual void Alert(string Msg);
        public void Alert(ValidationException vEx);
        public virtual void Alert(string Msg, int? ShowDelayTime);
        public virtual void Alert(string Msg, string title);
        public virtual void Alert(string Msg, string title, int? ShowDelayTime);
       
        protected virtual void OnUniButton_Click(object sender, JsFW_ButtonEventArgs e);
       
        protected void ShowDebugWindow(DataBase_Business DataBase, Control _opener);
        protected void ShowDebugWindow(DataBase_Business DataBase, string _opener);


Alert을 보면 예외 관련해서 몇가지 받고, 메세지처리도 하고..

또 ShowDebugWindow 처럼 비지니스 호출하면서 디버그창을 띠울지 말지도 지원이 된다.


 BaseForm : Form, IFadeEffect 를 구현해두어서...

윈7에서는 그닥 효과가 눈에 안띠지만..

기존xp같은경우 FormShow 될때 서서히 나타나고 Close될때 서서히 사라지는 효과도 구현이 되어있다.



OnUniButton_Click 는 Button을 컨트롤로 직접 구현해두고 Click이벤트를 재정의 할수 있도록 가상메서드로 구현해두었다.

UniButton으로 만들어진 UniBtnClick 이벤트에 핸들러로 붙일수 있고
이때 버튼에 특정기능코드를 넣었을때 버튼처리를 분기할수 있도록 해놨기에....

아... 실수로 접근제한자를 잘못 넣어놔서 안보이는 중...

간단히 예제에 대한 처리.. 소스를 살짝쿵... 적어본다.


 protected override void OnUniButton_Click(object sender, JsFW_ButtonEventArgs e)
        {
            base.OnUniButton_Click(sender, e);

            switch (e.Code)
            {
                case Button_Codes.등록: break;
                case Button_Codes.닫기: break;
                case Button_Codes.Special :
                    switch (e.Special)
                    {
                        case Button_Codes_Special.SpecialBtn1: break;
                        case Button_Codes_Special.없다: break;
                    }
                    break;
            }
        }

이런형태로 버튼마다 생성시 해당 기능을 설정해두면 클릭이벤트에 위 메서드로 연결해주면
각 버튼별 처리를 위처럼 분리해서 구현할수 있다.
여기에 비지니스처리등을 각각 맞게 설정가능하다.


필요해서 만들어두었던 객체 하나를 까먹고 있었다. 왜만들어놨지 라는 의문에 쌓였던...

JsFW.Xml.ListMng<T> 라는 기본타입..
제너릭을 이용한 리스트관리였던것...

본래 취지가 기억이 안나는 ㅡ.,ㅡ;;; 그런 객체인데.. 음... Insert, Update, Delete가 protected internal로 되있는거 보면..

새로운 관리 객체로 만들어 사용하도록 만든거였는데 직접 구현해보니... 먼가 빠진듯 한데... 쩝!!


1. 기본 xml클래스 정의

 [JsFW.Xml.XmlRoot_Tag("AA"), JsFW.Xml.XmlElement_Tag("DD")]
    public class AA : JsFW.Xml.JsFWXmlBaseObject
    {
        string _TA = string.Empty;

        [JsFW.Xml.XmlATT_Tag]
        public string TA
        {
            get { return _TA; }
            set { _TA = value; }
        }
    }

2. 리스트로 관리할 객체 재정의 
 public class AAList : JsFW.Xml.ListMng<AA>
    {
        public AAList() : base(@"D:\ttt\","test.xml",  typeof(AA).Name )
        {}

        public void Add(AA a)
        {
            base.Insert(a);
        }
      
        public void Remove(AA a)
        {
            base.Delete(a);
        }

        public override string ToString()
        {
            return base.ToString();
        }
    }



3. 리스트 사용!!
            AAList alst = new AAList();
            alst.Add(new AA() { TA = "OA" });
            alst.Save();


결과

<?xml version="1.0" encoding="utf-8" ?>
- <AA ID_IDENTITY="6">
  <CC _XID="1" TA="A1" />
  <CC _XID="2" TA="up1" />
  <DD _XID="3" TA="A1" />
  <DD _XID="4" TA="A1" />
  <DD _XID="5" TA="A1" />
  <KK />
  <DD _XID="6" TA="OA" />  입력 잘되었다!!  
  </AA>





* 참고 :  JsFW.Xml.XmlElement_Tag("DD") <-- 지정되있으므로 해당 갯수만큼만 나옴 위에 xml에서 총 4개의 Element가 로드되고 아래 소스에서 1번 index를 삭제함. 

            AAList alst = new AAList();
            alst.Remove( alst.DataSource[ 1 ]);
            alst.Save();

삭제 결과

<?xml version="1.0" encoding="utf-8" ?>
- <AA ID_IDENTITY="6">
  <CC _XID="1" TA="A1" />
  <CC _XID="2" TA="up1" />
  <DD _XID="3" TA="A1" />
<DD _XID="4" TA="A1" /> <-- 삭제된 Element
  <DD _XID="5" TA="A1" />
  <KK />
  <DD _XID="6" TA="OA" />
  </AA>