퇴근5분전




훈스에서 게임만드시는것 같은뎅... 졸작하시는것도 같은.. 질문에

잠깐 짬내서 만들어봤다.

Access 라해서 엑셀인가 했는데 MsAccess를 찾으니 mdb로 나온다.


이 예제는 간단히 mdb를 Com dll을 이용해서 생성하고 테이블을 만든 후

데이타 저장및 쿼리등을 할수 있다.

'# 3) .Net ( Vs 2008 ) > C#' 카테고리의 다른 글

MS-Chart Demo  (0) 2010.11.05
포스트 잇 처럼 메모하는 레이아웃!!  (0) 2010.09.30
WebClient와 WebBrowser의 차이는??  (3) 2010.07.30
LINQ 그룹바이... 훌...  (0) 2010.07.30
Double.Parser()...  (0) 2010.07.19


훈스에 올라온 질문중에 한글이 들어간 파라미터를 사용하는 OpenAPI 주소를 넣으면
xml을 제대로 쿼리해오지 못한다고 해서...
 
URI에 한글이 있고 없고 차이였는데... WebClient에 넣으면 자동 인코딩이되어 데이타가 안나오고
WebBrowser에 넣으면 제대로 데이타가 나온다.


WebClient로 해봤으나.. 역시 기초부족일테고, httpWebRequest도 해보고 WebRequest....

다 써봤는데 젠장... 제대로 안온다.?

Explorer에 주소 치고 엔터 치면 가져온다...

그래서 WebBrowser에 Url 속성에 넣고 가져와봤더니 가져온다..???

여기서..........         겁나 깝깝했다... 하나는 가져오고 하나는 가져오지 않는다.

근데 WebBrowser는 컨트롤인데 좀 패키지화 시키기 어정쩡한?

그래서 나온 소스가?

 delegate void GetXml(string _xml);
        private void MM(Uri ur, GetXml write)
        {
            WebBrowser wb = new WebBrowser();
            {
                wb.Url = ur;
                wb.DocumentCompleted += (s, e) =>
                {
                    write(wb.DocumentText);
                    using (wb) { /* 객체를 없애기 위해 */ };
                };
                wb.Refresh(WebBrowserRefreshOption.Completely);
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Uri ur = new Uri("~~~~~~~");
            MM(ur, x => [webBrowser1.DocumentText] = x);
        }


풋... 좀 깬다 ㅡ.,ㅡ;;;

이건.. 유틸용으로다... 쩝.....
  public class Util
        {
            public delegate void GetXml(string _xml);
            public static void MM(Uri ur, GetXml write)
            {
                WebBrowser wb = new WebBrowser();
                {
                    wb.Url = ur;
                    wb.DocumentCompleted += (s, e) =>
                    {
                        write(wb.DocumentText);
                        using (wb) { /* 객체를 없애기 위해 */ };
                    };
                    wb.Refresh(WebBrowserRefreshOption.Completely);
                }
            }
        }

        // 사용할때~
        private void button1_Click(object sender, EventArgs e)
        {
            Uri ur = new Uri("~~~~~~~~");
            Util.MM(ur, x => [webBrowser1.DocumentText]  = x);
        }


더워서 더는 못하겠따~!!!

'# 3) .Net ( Vs 2008 ) > C#' 카테고리의 다른 글

포스트 잇 처럼 메모하는 레이아웃!!  (0) 2010.09.30
Ms Access 사용하기 예제소스.  (0) 2010.08.11
LINQ 그룹바이... 훌...  (0) 2010.07.30
Double.Parser()...  (0) 2010.07.19
암묵적인 형변환? 코드...?  (0) 2010.05.18


훈스에 올라온 질문글에 무심코 그룹바이로 하면 쉬울것 같아요... ....................

LINQ는 간간히 msdn보면서 하고 있지만...

무심코 한말을 되집어 보고자 직접 쿼리에 도전...

ㅡ.,ㅡ; 1시간 넘게 삽질 했넹..

Sum .. 이넘때메...








그룹바이 은근 어렵넹.

dt = new DataTable();

            dt.Columns.Add("A");
            dt.Columns.Add("B");

            dt.Rows.Add(new object[] { "A", 10 });
            dt.Rows.Add(new object[] { "A", 10 });
            dt.Rows.Add(new object[] { "B", 10 });
            dt.Rows.Add(new object[] { "A", 10 });

            var a = from tmp in dt.AsEnumerable()
                    group tmp by tmp.Field<string>("A") into k
                    select new
                    {

                        c1 = k.Key,
                        c2 = k.Sum(sum =>  Convert.ToInt32( sum.Field<string>("B") ))
                    };

            DataTable result = new DataTable();
            result = dt.Clone();
            foreach (var tt in a)
            {
                result.Rows.Add(new object[] { tt.c1, tt.c2 });
            }

'# 3) .Net ( Vs 2008 ) > C#' 카테고리의 다른 글

Ms Access 사용하기 예제소스.  (0) 2010.08.11
WebClient와 WebBrowser의 차이는??  (3) 2010.07.30
Double.Parser()...  (0) 2010.07.19
암묵적인 형변환? 코드...?  (0) 2010.05.18
IPC .Net ( 프로세스간 통신 )  (1) 2010.05.12


더블값 부호 후행 처리를 위해...

  string ss = "5000.00-";
            double d =  double.Parse(ss, System.Globalization.NumberStyles.AllowTrailingSign | System.Globalization.NumberStyles.Float);

SAP에서는 -가 뒤에 붙어오는데 이를 바꾸기 위해 위처럼. NumberStyles 값을 or해주면 된다.

어쨌든...  굵은 글씨를...

훈스에 김시원님이 강좌에 개나소나...로 써주셨던.. 난 몰랐던... ㅠㅠ;

찾아보니..  아래처럼 되는것? 같은... 글이었음.


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

            SomeType st = 0;
            int i = st;

        }
    }

    class SomeType
    {
        object _obj = 0;

        public object Value
        {
            get { return _obj; }
          private  set { _obj = value; }
        }

        public SomeType(object obj)
        {
            _obj = obj;
        }

        public static implicit operator SomeType(int typ)
        {
            try
            {
                 return new SomeType(typ);
            }
            catch(Exception ex ) {
                throw ex;
            }

        }

        public static implicit operator int(SomeType typ)
        {
            try
            {
                checked
                {
                    return (int)typ.Value;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }

        }
    }

'# 3) .Net ( Vs 2008 ) > C#' 카테고리의 다른 글

LINQ 그룹바이... 훌...  (0) 2010.07.30
Double.Parser()...  (0) 2010.07.19
IPC .Net ( 프로세스간 통신 )  (1) 2010.05.12
VB의 Left구현하기... 확장메서드를 이용함...  (0) 2010.02.22
기간 출력하고자 할때...  (0) 2010.02.18


참조 http://msdn.microsoft.com/ko-kr/library/system.runtime.remoting.channels.ipc(VS.90).aspx 

훈스 게시판에 몇일전부터 [프로스세간 통신(IPC)] 과 관련하여 질문이 올라오고 있었는데...

찾아보니 위 참조 링크처럼 심플한게 있다.

구현해본결과 오!! 이런게 되는구나...


서버와 클라이언트... 예제를 실행한 결과 이미지이다.

클라이언트에서 객체 요청이 있을때마다 서버에서는 원격객체에 값을 + 1 해서 전달해준다.

예제는 서버, 클라이언트, 원격객체 세 프로젝트로 구성된다.

 * 원격객체를 서버, 클라이언트에 각각 참조시켜야 한다.  
  서버에서 정의 하고 클라이언트에서 정의를 또하고 해봤는데 에러가 뜬다 공개토큰이 null이 어쩌고 저쩌고... 삽질..

예제를 올려놓는다.

 
간단해서.. 그닥.. 기록할내용은 없는듯...


사용법 : 
   this.Text = "ABCCC".Left(2);

확장메서드 구현 : 
 

 /// <summary>
    /// VB.Left() 함수를 구현한 확장메서드임.
    /// </summary>
    internal static class exString
    {
        /// <summary>
        ///  VB.Left() 함수를 구현한 확장메서드임.
        /// </summary>
        /// <param name="targetstr"></param>
        /// <param name="length">왼쪽에서~~ </param>
        /// <returns></returns>
        internal static string Left(this string targetstr, int length)
        {
            if (length < 0) // -1이 들어왔을때...
                throw new Exception("'Length' 인수는 0보다 크거나 같아야 합니다.");

            if (targetstr.Length > length )
            {
                return targetstr.Substring(0, length);
            }
            else
            {
                return targetstr;
            }
        }

        /// <summary>
        /// VB.Right() 함수를 구현한 확장메서드
        /// </summary>
        /// <param name="targetstr"></param>
        /// <param name="length"></param>
        /// <returns></returns>
        internal static string Right(this string targetstr, int length)
        {
            if (length < 0)
            {
                throw new Exception("'Length' 인수는 0보다 크거나 같아야 합니다.");
            }

            if (targetstr.Length > length)
            {
                return targetstr.Substring(targetstr.Length - length, length);
            }
            else
            {
                return targetstr;
            }
        }
    }


2010, 2, 25 일 Right 추가..

훈스 C#게시판에 올라온 글에 대한 답변을 찾아보던 중,..

VB에 Format(일수, "mm" )  이란 함수를 호출하면 일자에 맞는 기간을 출력해준다고 한다
예)
     399  를 넣으면  "1년 1개월 3일" 이 나온다고 한다.

머리를 조낸 굴려봐도 지원되는 객체는 안보인다..

기간에 해당하는것 하면 TimeSpan이 바로 떠오르는데...

TimeSpan에서 출력해주는 건 전혀 없다.

아래와 같이 직접 구해야 하는듯 하다.


TimeSpan.Zero ~ TimeSpan.FormDays( 일수 ) 만큼에 Tick값으로

DateTime을 생성하면  DateTime의 초기값 1년 1월 1일 ~ 계산되어 만들어진다.

DateTimeOffset객체에서 ToOffSet(  TimeSpan  ); 메서드를 이용해볼까 했었는데...

이거자체가 DateTime때문에 에러가 뜨게 되므로...
직접 포멧을 지정해야한다. 

          double day = 399;
          DateTimeOffset off = new DateTime(TimeSpan.FromDays( day ).Ticks );
          MessageBox.Show(string.Format("{0}년 {1}개월 {2}일", off.Year - 1, off.Month - 1, off.Day - 1));

DateTimeOffset 은 그냥 ... 알게된 객체이므로... 써본다.
http://msdn.microsoft.com/ko-kr/library/system.datetimeoffset_members.aspx



추가적으로 WPF 게시판에 올라왔던 답변을 좀 허접하게 달았던 내용을
다음과 같이 처리한다.

질문내용은 두날짜간에 개월수 차이를 구하여 컬럼으로 표시하고자 하는 부분이었으나

처음 단 답글은 년차를 월에 포함하지 못하는 상황과 약간에 판단착오가 있었다.
이에 대해.. 위 기간 구하는것을 참고하여 아래와 같이 바꾸고 그 답변에 대해 알림형태로 게시판에 남겼다.

            DateTime dt = new DateTime(2001, 2, 1);
            DateTime dt2 = new DateTime( Math.Abs( ( new DateTime(2002, 2, 27).Subtract( dt ).Ticks ) ) );
            MessageBox.Show((      ((dt2.Year-1) * 12) + ( dt2.Month )     ).ToString());


훈스닷넷에서 NotifyIcon 활성화 하고.

마우스 왼쪽, 오른쪽 버튼을 각각 다른 메뉴를 주고 싶다고 하신분께 올린 답글임.

몇가지 방법을 찾아봤는데 애매 했었으나...

ContextMenuStrip.Show   에서 해결책이 하나 있고.

여기에 부합되게 MousePosition 이란 값을 이용할수 있었다.

NotifyIcon 의 mouseEvt 에  이벤트 매개변수를 이용해봤지만 원하는곳에 Show가 안된다!

그래서 MousePosition 을 이용해서 마우스 위치값을 사용함. 아주 잘된다!









초보시라니 초간단.... 방법을 소개 해드리죵...
 
구성은 Form 1개
 
NotifyIcon 1개
 
ContextMenuStrip 2개 (Left용, Right용 )
 
주의 NotifyIcon에 ContextMenuStrip 속성에는 바인딩 하지 않습니다.
 
 
 
아래소스 대로 돌려보세용... 원하시는데로~~ 될꺼임돵.
 
 
 
 
 public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.Load += new EventHandler(Form1_Load);
            this.Shown += new EventHandler(Form1_Shown);
        }
        void Form1_Shown(object sender, EventArgs e)
        {
            this.Hide();
        }
        void Form1_Load(object sender, EventArgs e)
        {
       //this.notifyIcon1.ContextMenuStrip = contextMenuStrip1; 바인딩하지 않는다!
            this.notifyIcon1.MouseDown += new MouseEventHandler(contextMenuStrip1_MouseDown);
        }
        void contextMenuStrip1_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                contextMenuStrip1.Show( MousePosition );
            }
            else if( e.Button == MouseButtons.Right)
            {
                contextMenuStrip2.Show(MousePosition);
            }
        }
        private void leftMouseDownToolStripMenuItem_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Left Click");
        }
        private void rightMouseToolStripMenuItem_Click(object sender, EventArgs e)
        {
            MessageBox.Show("RightClick");
        }
    }


훈스 C# 게시판에 올라온 질문에 대한 답글로 잠깐 만들어서 답글을 했던 내용임.

ComboBox에 바인딩하고 이값에 대한 값을 처리할때 단위데이타를 만들고 이에 대한 집합을 만들어
콤보 박스에 바인딩해주면 나중에 단위데이타가 여럿 일 경우 해당 단위데이타 상태까지도 컨트롤 가능해짐 .

예제에는 ComboBox 1개, TextBox 1개
             ComboBox.SelectedIndexChanged 이벤트

소스 ~~~


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

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

            ComboList clist = new ComboList();
            clist.Add("A", "1");
            clist.Add("B", "2");
            clist.Add("C", "3");
            clist.Add("D", "4");

            comboBox1.DataSource = clist;              // IListSource를 요구함.
            comboBox1.DisplayMember = "Name";
            comboBox1.ValueMember = "Value";
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.textBox1.Text = ((_ComboItem)comboBox1.SelectedItem).Value;
           // 바인딩 된 Item을 가지고 처리 하므로 단위 아이템의 프로퍼티 갯수는 증감할 수 있음.
        }
    }


    public class _ComboItem  // 단위 아이템
    {
       public string Name { get; set; }
       public string Value { get; set; }

       public override string ToString()
       {
           return Name; // combobox에 디스플레이 됨.
       }
    }

    public class ComboList : IListSource  // 집합아이템
    {
        List<_ComboItem> items = new List<_ComboItem>();

        public void Add(string _Name, string _Value)
        {
            items.Add(new _ComboItem() { Name = _Name, Value = _Value });
            // 2005에서는 _ComboItem에 생성자로 파라미터를 받으면 됨.
        }

        public string this[string Name] 
// 인덱서를 이용하여 단위데이타에 대한 추적이 객체명[ 단위데이타이름 ]으로 가능.
        {
            get {
                string returnValue = string.Empty;

                foreach (_ComboItem item in items)
                {
                    if (item.Name == Name)
                    {
                        returnValue = item.Value;
                        break;
                    }
                }

                return returnValue;
           
            }
        }

        #region IListSource 멤버

        public bool ContainsListCollection
        {
            get { return true; }
        }

        public System.Collections.IList GetList()
        {
            return items;
        }

        #endregion
    }

}

// 여기서 빠진거라면 단위데이타를 제거하는 Dispose와 Clear 기능임.  빠진다고 해서 그닥.. 큰 영향은 없는듯도 하고..
// 많아 진다면... 구현해주는게 좀더 나을것 같다.