foreach문을 돌려서.. -_-

 얻어냈다.

Column에 대한 데이터를 난 그동안 무식하게도 -_-;; Reader를 통해서 했는데..

ADO.NET.. 강하다..

-_- 단지.. col(컬럼).DataType 하면 다 나왔다 -_-;;

다들 알고는 있을 것이다.

데이터 베이스의 필드의 값들은 타입이 정해져있다는 것을.

보통 System.String이나 System.Decimal 타입을 많이 쓴다.

물론 bool도 쓰겠지만 필자가 쓰는 경우는 저런 경우가 대다수라서..

다른 사항은 DataType에 대해서 직접 당겨써보면 알 것이다.


그동안 솔직히 이걸 얻기위해서 미련하게도

Column에대한 루프를 돌려서 Row와 Column 을 통해서 얻었다..

하지만.. -_-..

오늘 테스트 해 본결과 -_-; 난 역시 모르는게 많았다.

그 코드가 반 이상 줄 줄은..

-_- 지금은 정신이 몽~ 롱 한 관계로 코드는 내일 올려야겠다.

필자처럼 삽질하는 사람이 없기를 바라며..
ADO.NET을 요새 자주 이용한다

SqlConnection conn = new SqlConnectint(연결문);
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandString = 쿼리;
SqlDataAdapter Adapter = new SqlDataAdapter();
Adapter.SelectCommand = cmd;
DataSet DS = new DataSet();
Adapter.Fill(DS,"테이블명");
데이터 그리드뷰.DataSource = DS.Tables[테이블명].DefaultView;

이런 식으로 이용한다.

솔직히 주로 ListView라던지 List를 이용해서 데이터를 보여주고 했었다.

Java를 할 경우 JTable을 이용해서 보이곤 했었는데

이놈을 접하니.. -_-b 라는 표현 밖에 안나온다;;

왜!! 엄청 편하니까!!

하지만 바인딩을 잘못시키면.. 전혀 의외의 결과가 나온다.

CheckBox를 포함하는 형으로 만들면서 잠시 멍하게 있었었다.

체크 유무를 가져오는 방법을 몰랐었기 때문이다 -_-

근데.. 의외로 간단한 면도 많았다.

데이터그리드.Rows[][].Value 를 하면

True와 False를 반환한다.

다음에 좀 더 많은 부분을 해보고 여기서 이만.. 줄여야겠다.
[C#]DataGridView에 대해서 C# 2009. 3. 18. 21:05
C#에서 데이터 그리드 뷰는 테이블을 생성하고 컬럼을 넣는다.

그 형식은

테이블명.Columns.Add("컬럼명",typeof(데이터타입));

을 해 주면 DataAdapter를 이용하지 않고 넣을 수 있다.

DataAdapter를 이용할 경우 Fill을 이용해서 DataSource를 적용시켜 표현한다.

물론 일일이 데이터를 적용시킬 때도 이용한다.

그 방식은
 
그리드뷰 Name.DataSource = 테이블명;

형식으로 사용한다.

DataGridView의 매력은 역시.. 사람들의 취향이겠지만

Adapter를 이용하는가?

개개의 데이터를 이용해서 꾸미는가?

차이인.. 것? 같다 ㅎㅎ

아직은 공부하는 입장이니 결론은 못내리겠다.

하지만 필자는 Adapter에 훨씬 매력을 느낀다
음.. -_-a 솔직히.. 보기 좋은건 필자는 ListView라고 생각하는데..

DataGrid의 강력함은 역시 좋았다 -_-;; 글고 UI도 ListView에 뒤지지 않았다;;

몇 만개의 데이터를 처리한다고 하면.. -_-;; 누구나 결과를 예상할 것이다;;

엄청난 과부하로 ListView는 -_-;; 죽어버린다;;

자신의 타입을 따라가는 것도 좋지만..

효율성과 자신의 개성을 따라가는 것이 중요한다.. ㅠ_ㅠ
[C#] 프린트 C# 2009. 2. 3. 21:56

흠.. 일단 간단한 프린트를 하기 위한 코드이다.

각 출력 결과에 따른 포멧 형식은 자신들이 정해야겠지만..

필자는 단지 출력 테스트를 한 것 뿐..

별 다른게 없다^_^

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

namespace Print
{
    public partial class Form1 : Form
    {
        private PageSettings m_PageSetting = null;
        private Font m_subFont = new Font("굴림체",13);
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                PageSetupDialog Psetup = new PageSetupDialog();
                if (this.m_PageSetting == null)
                    this.m_PageSetting = new PageSettings();
                Psetup.PageSettings = this.m_PageSetting;
                Psetup.ShowDialog();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                PrintDocument pd = new PrintDocument();
                pd.PrintPage += new PrintPageEventHandler(this.PrintPageEvent);

                if (this.m_PageSetting != null)
                    pd.DefaultPageSettings = this.m_PageSetting;

                PrintPreviewDialog pdlg = new PrintPreviewDialog();
                pdlg.Document = pd;
                pdlg.ShowDialog();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        protected void PrintPageEvent(Object obj,PrintPageEventArgs pea)
        {
            Graphics g = pea.Graphics;
            PrintDocument(g);
            pea.HasMorePages=false;
        }

        private void PrintDocument(Graphics g)
        {
            g.FillRectangle(Brushes.White, 100, 50, 800, 600);
            StringFormat sf = new StringFormat();
            sf.Alignment = StringAlignment.Center;
            sf.LineAlignment = StringAlignment.Center;
            Rectangle rect = new Rectangle(110, 130, 400, this.m_subFont.Height * 10);
            g.DrawString(this.txt_Content.Text, this.m_subFont, Brushes.Black, rect);
        }

        private void button3_Click(object sender, System.EventArgs e)
        {
            try
            {
                PrintDocument pd = new PrintDocument();
                pd.PrintPage += new PrintPageEventHandler(this.PrintPageEvent);
                if (this.m_PageSetting != null)
                    pd.DefaultPageSettings = this.m_PageSetting;
                PrintDialog pdlg = new PrintDialog();
                pdlg.Document = pd;
                if (pdlg.ShowDialog() == DialogResult.OK)
                {
                    pd.Print();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }
}

[C#] 윈도우 좌표~ C# 2009. 1. 19. 17:44
            Rectangle screenRect = Screen.PrimaryScreen.WorkingArea;
            Rectangle tempRect = new Rectangle(screenRect.Right - 890, -8, 500, 0);
            this.DesktopBounds = tempRect;

-_-ㅋ 말 그대로 좌표를 가지고 온답;;;
[C#]Tray Icon C# 2009. 1. 16. 15:43

Tray Icon..

-_-a 뭐 기본적으로 그런 내용이다;;

언젠가 쉽게 쓸 일이 있겠지 ㅋㅋ

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            e.Cancel = true;//이벤트 취소
            this.WindowState = FormWindowState.Minimized;//폼 최소화
            this.ShowInTaskbar = false;//작업표시줄 표시 금지
        }

        private void Tray_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            this.Visible = true;
            this.ShowInTaskbar = true;    // 현재 프로그램을 테스크 바에 표시하게 한다.   
            this.WindowState = FormWindowState.Normal; // 폼을 윈도 상태를 normal
            Tray.Visible = false; // 트레이의 아이콘을 보이지 않게 한다. 
        }

아 -_- contextmenu 넣어줄라면?
this.tray.contextmenu=this.contextmenu(생성한것) 해주기!

[C#]volatile C# 2009. 1. 15. 10:38

volatile 키워드는 동시에 실행 중인 여러 스레드에 의해 필드가 수정될 수 있음을 나타냅니다. volatile로 선언된 필드에는 단일 스레드를 통한 액세스를 전제로 하는 컴파일러 최적화가 적용되지 않습니다. 이렇게 하면 필드의 값을 항상 최신 상태로 유지할 수 있습니다.

일반적으로 volatile 한정자는 액세스를 serialize할 때 lock 문을 사용하지 않고 여러 스레드에서 액세스하는 필드에 사용됩니다. 

volatile 키워드는 다음과 같은 형식의 필드에 적용할 수 있습니다.

  • 참조 형식

  • 안전하지 않은 컨텍스트의 포인터 형식. 포인터 자체는 volatile일 수 있지만 포인터가 가리키는 개체는 volatile일 수 없습니다. 즉, "volatile 개체에 대한 포인터"를 선언할 수 없습니다.

  • sbyte, byte, short, ushort, int, uint, char, float 및 bool 같은 정수 계열 형식

  • 정수 계열 형식을 기반으로 한 열거형

  • 참조 형식으로 알려진 제네릭 형식 매개 변수

  • IntPtrUIntPtr

volatile 키워드는 클래스 또는 구조체의 필드에만 적용할 수 있습니다. 지역 변수는 volatile로 선언할 수 없습니다. 

[예제]

// csharp_volatile.cs

// Compile with: /target:library

class Test

{

   public volatile int i;


   Test(int _i)

   {

      i = _i;

   }

}


출처 : MSDN

[C#]스레드 C# 2009. 1. 14. 10:47
스레드 생성에는 Thread,ThreadPool,Timer Class를 이용한 세가지 방법이 존재한다.

여기서 Thread Class를 이용한 스레드는 과도한 문맥전환의 문제가 있을 수 있다.

이에 ThreadPool Class는 Pool을 구성하고 적정량의 스레드를 수용함으로

Thread Class를 이용한 것보다 좀 더 안정적이다.

Timer Class의 경우는 일정 시간마다 스레드를 자동으로 활성화 해 준다.

1.Thread Class

Thread th = new Thread(new ThreadStart(대상));

2. ThreadPool Class

ThreadPool.QueueUserWorkItem(new WaitCallBack(대상,null);

3. Timer Class

Timer timer = new Timer(new TimerCallBack(대상),null,시간,100);
[C#]BackgroundWorker. C# 2009. 1. 12. 14:20
private BackgroundWorker myWorker = new BackgroundWorker();

myWorker.DoWork += new DoWorkEventHandler(myWorker_DoWork);
myWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(myWorker_RunWorkerCompleted);
myWorker.RunWorkerAsync() ;

먼저 BackgroundWorker는 다른 영역의 쓰레드를 실행 시키게 해 준다.

즉 메인 영역의 쓰레드가 아닌 별개의 영역을 말한다.

여기서 생성된 쓰레드는 DoWork 이벤트 핸들러에 의해서 작업이 수행된다.

만약 DoWork의 작업이 완료되거나 취소될 경우는 그 다음 RunWorkerCompletedEventHandler가 실행되어 쓰레드의 종료 또는 취소 후의 처리를 해 준다.

myWorker.RunWorkerAsync() 는 다른 영역에서 쓰레드가 실행되게 해 준다는 뜻이다.