반응형

안녕하세요.

 

코딩하는남자 입니다

 

이번 블로그 내용은 C#을 통해 차트를 작성할경우 보통 상용 API를 통해 구현하게 되는데요

 

 

 

저희 같은 서민들은 그걸 구입할 돈이 없지요ㅋ

 

그래서 열심히 인터넷 검색을 통해서 무료로 사용할 수 있는 차트가 있어서 소개해 드릴려고 합니다

 

마도 MS Chart 인데요.

 

비쥬얼스튜디오에서 개발하는 C#에서 사용하기 참 좋은 API라고 생각합니다

 

혹시 자체 개발을 통해 어떠한 통계나 수치를 표현하고 싶으시면 한번 시도해 보시면 좋을거 같습니다

 

C#으로 구현하기 위해 간단한 예제를 같이 올려 드리니 분석 해서 나만의 차트를 구현해 보시기 바랍니다

 

[Souce Code]

 

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;
using System.Windows.Forms.DataVisualization.Charting;
using System.Diagnostics;



namespace MSChart_Controls_Test{
     public partial class Form1 : Form
     {
         Chart chart = null;

        public Form1()
        {
            InitializeComponent();

            ChartDataInput();
         }



        private void ChartDataInput()
        {
            //x,y축에 사용될 값을 먼저 준비 한다
            //x축 값
            string[] xValues1 = { "Korea", "Frence", "Canada", "Germany", "Italy" };

            //y축 값
            double[] yValues1 = { 67.66, 89.57, 82.44, 85.24, 87.93 };
            double[] yValues2 = { 77.66, 89.57, 92.44, 95.24, 97.93 };

            //차트를 변수에 담아주고
            chart = this.chart1;

            //계열을 초기화 처음에 Series1이 기본으로 들어가기 때문에 삭제해 준다
            chart.Series.Clear();

            //계열을 새로 생성해서
            Series s1 = new Series("international");
            Series s2 = new Series("International2");

            //계열을 추가해 준다
           chart.Series.Add(s1);
           chart.Series.Add(s2);

          //추가된 계열에 값을 넣어준다
          //x축 값은 하나만 있으면 되기 때문에 처음부터 데이터를 하나만 준비한다
          //만약 s2애 x축값도 만들어서 DataBindXY로 값을 넣어도 x축은 변경되지 않는다

          //한번설정하면 Y축은 값이 변경되어도 X축은 값이 변경되지 않는다
          s1.Points.DataBindXY(xValues1, yValues1);
          s2.Points.DataBindY(yValues2);

          //차트타입을 막대로 한다
          s1.ChartType = SeriesChartType.Column;

         //범례를 보여준다 
         chart.Legends[0].Enabled = true;

         //테두리선굵기 (선종류로 해야 차이가 나타난다)
         s1.BorderWidth = 12;

        //색 변경
        s1.Color = Color.OrangeRed;

        //계열에 값표시
        s1.IsValueShownAsLabel = true;

        //계열에 그라데이션을 준다
        s1.BackGradientStyle = GradientStyle.VerticalCenter;
        s2.BackGradientStyle = GradientStyle.Center;

       //아래 두줄을 풀변 상하 이중축이되고
       //s1.XAxisType = AxisType.Primary; //기본축
       //s2.XAxisType = AxisType.Secondary; //보조축

      //아래 두줄을 풀면 좌우 이중축이된다
      //s1.YAxisType = AxisType.Primary;
     //s2.YAxisType = AxisType.Secondary;

     //차트의 테두리선을 붉은색의 연결된 선으로 그리는데 선의 넓이는 1이다
     chart.BorderlineColor = Color.Red;
     chart.BorderlineDashStyle = ChartDashStyle.Solid;
     chart.BorderlineWidth = 1;

     //차트의 내부 테두리 선을 파란색의 연결된 선으로 그리는데 선의 넓이는 1이다
     chart.ChartAreas[0].BorderColor = Color.Blue;
     chart.ChartAreas[0].BorderDashStyle = ChartDashStyle.Solid;
     chart.ChartAreas[0].BorderWidth = 1;

     //차트의 내부 테두리 선을 변경
     chart.ChartAreas[0].AxisX.LineColor = Color.Blue;
     chart.ChartAreas[0].AxisY.LineColor = Color.Blue;
     //chart.ChartAreas[0].AxisX.Enabled = AxisEnabled.False;
     //chart.ChartAreas[0].AxisY.Enabled = AxisEnabled.False;

     //차트의 배경 격자선을 변경
     chart.ChartAreas[0].AxisX.MajorGrid.LineColor = Color.Blue;
     chart.ChartAreas[0].AxisY.MajorGrid.LineColor = Color.Blue;
     chart.ChartAreas[0].AxisX.MajorGrid.Enabled = false;
     chart.ChartAreas[0].AxisY.MajorGrid.LineDashStyle = ChartDashStyle.Dash;

     //차트의 외부로 삐져나온 선을 변경
     chart.ChartAreas[0].AxisX.MajorTickMark.LineColor = Color.Red;
     chart.ChartAreas[0].AxisY.MajorTickMark.LineColor = Color.Red;
     chart.ChartAreas[0].AxisX.MajorTickMark.Enabled = false;
     chart.ChartAreas[0].AxisY.MajorTickMark.Enabled = false;

      //첫번재 계열의 네번째 그래프만 파란색으로 변경
     s1.Points[4].Color = Color.Blue;
   }

private void ChartDataInput2()
    {
       //차트를 변수에 담아놓고
       chart = this.chart1;

       //계열도 변수에 담는다
       Series series1 = new Series("Test");
       Series series2 = new Series("Test2");

       //xValue를 준비
       string[] xValue = { "국어","영어","수학" };

       //계열을 초기화
       chart.Series.Clear();

       //계열을 추가
       chart.Series.Add(series1);
       chart.Series.Add(series2);

       //계열을 변수에 담지 않고 이렇게 바로 추가해도 된다

      //그러나 계열을 이렇게 선언하면 아래처럼 series1변수로 접근하지 못하고 chart.series[0] 또는

      //chart.series["Test"] 이렇게 접근해야 한다
       //chart.Series.Add("Test");
      //chart.Series.Add("Test2");

      //테두리선굵기 (선종류로 해야 차이가 나타난다)
      series1.BorderWidth = 12;

      //색 변경
      series1.Color = Color.OrangeRed;

      //차트 모양을 막대로 지정
      series1.ChartType = SeriesChartType.Column;
      series2.ChartType = SeriesChartType.Column;

      //테스트 계열에 값을 세개 추가
      series1.Points.AddY(21.7);
      series1.Points.AddY(20);
      series1.Points.AddY(18.5);

      //테스트2 계열에 값을 세개 추가
      series2.Points.AddY(22.4);
      series2.Points.AddY(19.2);
      series2.Points.AddY(23.8);
    }

     private void button1_Click(object sender, EventArgs e)
     {

        //차트를 변수에 담아놓고
       chart = this.chart1;

       //차트 모양을 꺽은선으로 변경
       if (chart.Series[0].ChartType == SeriesChartType.Column)
       {
           chart.Series[0].ChartType = SeriesChartType.FastLine;
           chart.Series[1].ChartType = SeriesChartType.FastLine;
        }
        else
        {
          chart.Series[0].ChartType = SeriesChartType.Column;
          chart.Series[1].ChartType = SeriesChartType.Column;
         }
     }

     private void button2_Click(object sender, EventArgs e)
     {
       //차트를 변수에 담아놓고
       chart = this.chart1;

        //원통형으로 변경
       chart.Series[1].CustomProperties = "DrawingStyle=Cylinder";

       //3D
       chart.ChartAreas[0].Area3DStyle.Enable3D = !(chart.ChartAreas[0].Area3DStyle.Enable3D);
     }

     private void button3_Click(object sender, EventArgs e)
     {
        //범례를 보여줬다가 안보여줬다가 한다
        this.chart1.Legends[0].Enabled = !(this.chart1.Legends[0].Enabled);
      }

      private void button4_Click(object sender, EventArgs e)
      {
        //첫번째 계열을 순환 하면서 가장 큰 계열의 색을 검은색으로 변경한다
        int point = 0;
        int yvalue = 0;

        for (int i = 0; i < this.chart1.Series[0].Points.Count; i++)
        {
            Debug.Print(this.chart1.Series[0].Points[i].YValues[0].ToString());
            if (yvalue < (int)this.chart1.Series[0].Points[i].YValues[0])
            {
                point = i;
                yvalue = (int)this.chart1.Series[0].Points[i].YValues[0];
             }
          }

        this.chart1.Series[0].Points[point].Color = Color.Black;
      }
    }
}

 

 

붙여넣기를 햇더니 코드가 많이 엉망이 됐네요ㅎㅎ

 

나중에 시간내서 정리하도록 하겠습니다~

 

그럼 코딩하는남자 였습니다~!

 

 

반응형
반응형

안녕하세요~

C# 프로그래밍을 연습 개발 하고 있는 코딩하는남자 입니다!!

 

이번에 연습해볼것은 QR코드 생성 인데요

왜 굳이 C#으로 QR코드를 생성해요? 라는 의구심이 드실거 같은데요

QR코드를 사용하여 활용할 곳이 생각보다 많다(?) 입니다ㅋㅋㅋ

굳이 예를 들면 인식이 필요한 프로그램 개발시

또는 자재관리, 재고관리, 재공관리, 물류관리, 편의점, 등

모든 물건을 다루는 곳에서 갯수, 금액 등을 관리하기 위한 인식코드로

많이 사용 할수 있을거 같네요

아 본문으로 돌아와서 C#에서 어떻게 문자열을 QR코드로 생성을 시키는지

보도록 하겠습니다

참고로 저도 인터넷 정보를 보고 연습을 하고 실전에 적용을 하는 입장이다 보니 검색을 통해 저보다 더 상세한 정보를 검색해 보실수 있으니 중복 검색은 필수 입니다

============================================

개발환경 : Visual Studio 2010 사용

QR코드 Generator DLL : 링크 참조

QR Code .NET Generator | Using free .NET sample to create QR Code barcodes

BizCode Generator for .NET Ultimate The most mature & flexible barcode SDK for Microsoft .NET Framework Quick Overviews Mature barcode creating SDK Support every .NET IDEs Support C#, VB.NET, etc. Dynamic barcodes support For all printers Overview QR Code More Barcode Tutorial C# Sample VB.NET S

www.businessrefinery.com

===============================================

준비가 되셨다면 차근 차근 이미지로 하나씩 따라 해볼까요?

 

1. QR코드 Generator DLL 다운로드 받기

: 링크를 통해 싸이트 접속 후 DOWNLOAD 버튼 클릭

어렵지 않아요

 

2. 비쥬얼 스튜디오에 참조 시키기

1) 다운로드 받은 파일 압축 풀기

※ 압축을 풀었을때 사진 입니다 처음에는 압축형식으로 되어 있어요~

 

 

2) 참조 DLL 찾기

압축을 풀면 다음과 같은 구조로 압축이 풀리게 되는데

저희가 사용할 DLL의 위치를 알려드릴께요~

천천히 그림파일을 참고해서 따라오세요~

 

 

3) 비쥬얼 스튜디오 DLL 참조 시키기

기본적인 비쥬얼 스튜디오에 DLL참조하는 방법은

아마 다들 아실꺼라고 생각하고 대충 넘어가겠습니다

절대 귀찮아서가 아닙니다!!

비쥬얼 스튜디오에 DLL을 첨부 완료되고 난 뒤에 화면 입니다

자 이제 거의 끝나가요~ 별거 없죠?ㅋ

이제 소스 코드로 넘어갈건데요

간단합니다 7줄이면 끝이에요~

참 쉬죠잉~ㅋㅋㅋ

 

 

4) 소스 작성하기

참조시킨 DLL 사용을 위해 참조선언을 먼저 작성해 주세요

사용하실려는 페이지의 제일 상단에 아래와 같이 using문을 작성해주시고요~

 

그다음 아래와 같이 QR코드를 생성할 소스 코드를 입력합니다

참고로 저는 이미지로 보이지 않고 Bitmap으로 전환하여 레포트 툴과 연동 시킬 예정입니다

만약 이미지로 만드실 경우 맨 아래 쪽 구문의 주석을 바꿔주시면 됩니다

QRCode barcode = new QRCode(); string url = pFIELD[22, 3]; barcode.Code = url; barcode.ModuleSize = 6.0f; barcode.Resolution = 300; //이미지로 저장 //barcode.drawBarcode2ImageFile("Temp.png"); //Bitmap으로 전환하여 사용 var barcodebitmap = (Bitmap)barcode.drawBarcodeOnBitmap();

이미지로 표시 할 경우는 위의 구문으로 처리가 완료가 되고 이벤트를 주셔서 사용하시면 Debug폴더 안에 이미지로 생성이 됩니다

 

참고로 저는 레포트툴과 연동을 하기 위해 하나의 구문이 더 필요한데

아래의 구문은 어떤 레포트툴을 사용하시는냐에 따라 달라지기 때문에 참고만 하시기 바랍니다

ARViewer21.Document.Pages[ThisPage].DrawImage(barcodebitmap, false, LSHIFT + ExTTI(1400), PTM + ExTTI(7430), ExTTI(500), ExTTI(420));

네 이상으로 C#을 이용해 QR코드 생성하는 예제였습니다!

글로 이해 안되실분들을 위해서 영상 제작을 해보았습니다

글과 영상을 통해 QR코드를 만들어 나만의 프로그램을 제작해보시는건 어떨까요?ㅎㅎ

이상 코딩하는남자 였습니다!!

반응형

+ Recent posts