퇴근5분전


BaseForm 메서드로 존재한다!!
날짜.jog 로 작성됨.

로그 디렉토리 설정 
기본값은 C:\Program Files\jsFW20_Dll
LoggingDirectoryPath = @"D:\ttt\";

로그 허용 조건..
 JsFW.DEBUG.DebugQueryForm.SetDebugAuthority();
또는
UsedLogging = true;


로그는...
try
{
        ...
}
catch (BaseException bEx)
{
        Alert(bEx);
}
또는

Debug_Logging(new BaseException( 로그 메세지,  Exception 예외 ));

이렇게하면 해당 디렉토리에 남는다.


예외를 발생하여 기록한 내용을 보자

<UniException 예외!>
-----[예외정보]-----
사용자:, 발생시각:2010-05-28 09:14:39
예외정보:스칼라 변수 "@@SERVER_NAME"을(를) 선언해야 합니다.
   위치: JsFW.ADONET.DataBase_DataAccess.JsFW.ADONET.IDataAccessComponent.ExcuteScalar(String Query, SqlParameter[] parameters)
   위치: JsFW.ADONET.DataBase_Business.ExcuteScalar(String Query, SqlParameter[] parameters)
   위치: WindowsFormsApplication1.Ver.ServerName() 파일 C:\Users\DokebiJs\Documents\Visual Studio 2008\Projects\NewADONET\WindowsFormsApplication1\Form1.cs:줄 61
   위치: WindowsFormsApplication1.Form1..ctor() 파일 C:\Users\DokebiJs\Documents\Visual Studio 2008\Projects\NewADONET\WindowsFormsApplication1\Form1.cs:줄 33
<데이타엑세스 예외!>
-----[Connection정보]-----
서버:___ , 데이타베이스:___ ,상태:Open




 




 기존 : DB 1개를 타겟으로 했었으나... 
 새로운 놈 : DB를 여러개로 설정가능하다. 

기본 DB와 함께 Excel 지원을 한다면... 두개의 DB로... 타겟을 설정할수 있다는 얘기!!

추가적으로 Factory를 만들어서 만든다.
 
예제는 천천히..
 
 

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>







 


xml관련해서 만든 dll을 이용해서 간단한 예제를 만들어본다.

잠깐 써봤던거라 예제 만들려고 하니 삽질은 필수였다.

xml파일로 만드는 방법은 두가지가 존재한다.

1. JsFW.Xml.XmlHelperClass 를 이용해서 직접 각 엘리먼트로 변환 하는 방법.

2. 클래스를 정의해서 JsFW.Xml.XmlClassForFileMng 로 관리 하는방법.


__1번으로 해보자. 

JsFW.Xml.XmlHelperClass hlp = new JsFW.Xml.XmlHelperClass(@"D:\ttt\test.xml");
            JsFW.Xml.XmlElmt kk = new JsFW.Xml.XmlElmt("KK");
            kk.Att_Add("_XID", "100");
            kk.Att_Add("JJJ", "212121212121abc");

            hlp.Root_XmlElmt.ElmtAdd(kk);
            this.textBox1.Text = hlp.ToXml(); // Xml형태로 변환하여 반환함.
            hlp.Save(@"D:\ttt\test.xml");

        ** 기본 xml 파일이 존재하여 위처럼 구현되며 신규파일로 작성시 

            JsFW.Xml.XmlHelperClass hlp = new JsFW.Xml.XmlHelperClass();
            hlp.Root_XmlElmt = new JsFW.Xml.XmlElmt("Root");
            hlp.Root_XmlElmt.Att_Add("_XID", "0");
JsFW.Xml.XmlElmt kk = new JsFW.Xml.XmlElmt("KK");
            kk.Att_Add("_XID", "100");
            kk.Att_Add("JJJ", "212121212121abc"); //수정도 Add로 한다. 있으면 수정, 없으면 추가!!
            hlp.Root_XmlElmt.ElmtAdd(kk);
            this.textBox1.Text = hlp.ToXml();
            hlp.Save(@"D:\ttt\test1.xml");   

로 작성이 된다.
결과 : 

<?xml version="1.0" encoding="utf-8" ?>
- <Root _XID="0">
  <KK _XID="100" JJJ="212121212121abc" />
</Root>



__2번으로 작성해보자.  

1단계 :  클래스 선언
    [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; }
        }
    }

JsFW.Xml.XmlClassForFileMng mng
= new JsFW.Xml.XmlClassForFileMng(@"D:\ttt\", "test.xml", typeof(AA));
           mng.Load();   
            AA a = new AA();
            a.TA = "A1";         
            mng.Add(a);
            // 수정시  : _XID 가 2인것을 찾아서 객체변환을 함.
            //AA b = JsFW.Xml.XmlTransform.Get_ElmtToObject(mng["2", typeof(AA)], typeof(AA)) as AA ;
            //b.TA = "up1";
            //mng.Update(b);  // 수정.
            mng.Save();

결과 :
 * 참고 : CC, DD , KK는 각각 XmlElement_Tag 를 바꾸어 추가를 해서 바뀌어 있음.
<?xml version="1.0" encoding="utf-8" ?>
- <AA ID_IDENTITY="5">
  <CC _XID="1" TA="A1" />
  <CC _XID="2" TA="up1" />   <!-- 수정된 Element  -->
  <DD _XID="3" TA="A1" />
  <DD _XID="4" TA="A1" />
  <DD _XID="5" TA="A1" />
  <KK />
  </AA>

'# 9) My Program(.NET) > JsFW20' 카테고리의 다른 글

JSFw20.Win.Controls에 BaseForm이용하기..  (0) 2010.05.26
JsFW20.XML 을 이용한 예제 2  (0) 2010.05.24
JsFW20를 이용한 DB Select.  (0) 2010.05.22
JsFW20 설치하기...  (0) 2010.05.22
NetWork 2010 0511  (0) 2010.05.12


* JsFW20을 설치 후 가능함.


1. 프로젝트를 생성한다.

2. 프로젝트 참조경로에 JsFW20 설치된 폴더를 추가해준다.
  기본 : 프로그램폴더\JsFW20Dll\

3. 응용프로그램설정( app.Config )파일 추가

4. DB연결에 필요한 App.Config를 추가 후 


<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="Server" value="서버명"/>
    <add key="DataBase" value="데이타베이스명"/>
    <add key="Uid" value="아이디"/>
    <add key="Pwd" value="패스워드"/>
  </appSettings>
</configuration>

으로 설정해준다.

5. JsFW.ADONET에 DataBase_Business 객체를 재정의 함.

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

 * 현재 DataBaseBusiness 에  List, Insert, Update, Delete 가 public으로 가상 메서드로 잡혀있다.
이를 재정의 해서 업무비지니스에 맞춰 재정의하거나 Execute**** 메서드등을 이용해서 메서드를 구성하면 된다. 
도움말 chm 참조!!

결과 스샷!



간단한 Select 코드 전문.


    Table_1 db = new Table_1();
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            dataGridView1.DataSource = db.List(null);
            dataGridView1.DataMember = "table";
        }
    }

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

 










'# 9) My Program(.NET) > JsFW20' 카테고리의 다른 글

JsFW20.XML 을 이용한 예제 2  (0) 2010.05.24
JsFW20.XML을 이용한 예제.  (0) 2010.05.24
JsFW20 설치하기...  (0) 2010.05.22
NetWork 2010 0511  (0) 2010.05.12
WinControls 2010 0402  (0) 2010.04.03

 내가 만든 개발 프레임웍은 다시 살펴보니... 조정되어야 할게 좀 많더라!!

완벽할수 없으니 뭐... 재끼고... 

 설치는 간단하다.

설치 파일을 클릭하면... 설치된다. ( 당연한거쥐?  )



설치하면 ...

위와 같이 dll들이 설치가 된다!! 준비는 끝!!





'# 9) My Program(.NET) > JsFW20' 카테고리의 다른 글

JsFW20.XML을 이용한 예제.  (0) 2010.05.24
JsFW20를 이용한 DB Select.  (0) 2010.05.22
NetWork 2010 0511  (0) 2010.05.12
WinControls 2010 0402  (0) 2010.04.03
XML 2010 0402  (2) 2010.04.03



 이미 블로깅 해서 그닥 쓸건 없고... ........


'# 9) My Program(.NET) > JsFW20' 카테고리의 다른 글

JsFW20를 이용한 DB Select.  (0) 2010.05.22
JsFW20 설치하기...  (0) 2010.05.22
WinControls 2010 0402  (0) 2010.04.03
XML 2010 0402  (2) 2010.04.03
Plugin 2010 0402  (0) 2010.04.03


아마 이게 제일 클것이다.

윈도우용 폼부터 직접 만든 컨트롤 + 여기저기서 수집한 몇개 컨트롤...들...


음 우선 설명은 생략하고...

나중에 다른 문서로 정리해야겠다.

'# 9) My Program(.NET) > JsFW20' 카테고리의 다른 글

JsFW20 설치하기...  (0) 2010.05.22
NetWork 2010 0511  (0) 2010.05.12
XML 2010 0402  (2) 2010.04.03
Plugin 2010 0402  (0) 2010.04.03
Exception 2010 0402  (0) 2010.04.02