기본 닷넷에서 제공하는 DataGridView 주로 사용하는데

주된 이유는 기본 콤포넌트라서 그리고 가벼워서 정도인데...

데이터 바인딩 하다보면 양이 많지도 않은데 완전 느려지는 경우가 있다.

이때를 대비해서 사용할 수 있는 DoubleBuffered 기능이 있다.

자세한 설명은 접고 그냥 따라 해보면 와C 완전빨라 경험한다.

 


using System.Reflection;


    public partial class frmMain : Form
    {
        public frmMain()
        {
            InitializeComponent();
            Init_DataGridView();
        }


        // 내용 blah blah


        private void Init_DataGridView()
        {
            grdData.DoubleBuffered(true);
        }
    }

////////////////////////////////////////////////////////////////////////////////////////////////////////////////


    public static class ExtenstionMethods
    {
        public static void DoubleBuffered(this DataGridView dgv, bool setting)
        {
            Type dgvType = dgv.GetType();
            PropertyInfo pi = dgvType.GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic);
            pi.SetValue(dgv, setting, null);
        }
    }


WRITTEN BY
테네시왈츠
항상 겸손하게 항상 새롭게 항상 진실하게

,

DB통신을 하다 보면 DataTable 을 이용한 핸들링이 참 많다.

그중에 해당 Row의 값을 이용한 특정컬럼을 구할때 마다 Linq를 이용하여 쉽게 값을 획득해 올수 있다.

할때마다 검색하는거 지겨워서 메모해 둔다.

private string GetItem(string GUBUN, string CODE)
{
try
{
var rowColl = dtItem.AsEnumerable(); // dataTable

string name = (from r in rowColl
where r.Field("CODE") == CODE
select r.Field(GUBUN)).First();

return name;
}
catch
{
return "";
}
}

 

특정값을 가진 dataTable 복사로도 가능

dt = ds.Tables[0].AsEnumerable()

.Where(Row=>Row.Field<string>("AAA") == "1" &&

Row.Field<string>("BBB") == "2")

.OrderByDescending(Row=>Row.Field<string>("CCC"))

.CopyToDataTable();

 

오랫만에 티스토리 안녕~


WRITTEN BY
테네시왈츠
항상 겸손하게 항상 새롭게 항상 진실하게

,

TiberoHelper.cs
0.14MB

아는 사람은 알겠지만.

MS-SQL : SqlHelper

Oracle : OracleHelper

주로 이용을 해왔다.

나름 괜찮은 라이브러리라 생각되고 현재까지도 잘 사용하고 있다.

이번에 Tiber로 db가 변경이 되어 Tibero도 Helper가 있다면 참 좋겠다라고 생각했는데

워낙 Tibero 자료가 넉넉치가 않다보니 갑갑하다.

Oracle의 대부분 기능을 Tibero가 흡수(?)라고 해야할지 베꼈다고 해야할지... 암튼 비슷한 구조라 판단이 되어

OracleHelper를 이용하여 Tibero에 맞게 수정을 했다.

결과적으로 문제없이 잘 된다.

---------------------------------------------------------------------------

오라클과는 달리 Oracle Client 설치 후 Oracle.Data.Client.dll 첨부 형태로 되지 않고

Tibero 6 db설치 이후 ODBC로 연결 설정을 추가적으로 해 주어야 한다.

이 부분은 구글링해서 해결했다.

단, 최신정보인 Tibero6 이 아닌 Tibero5버전의 자료가 대부분인데 이 부분은 최신버전에 맞게 설정해 주면 가능할 것 같다.

 

p.s 티맥스는 최신화 가이드 및 기술지원을 잘 배포해 주었으면 한다. <해결하기 위해 답답한 부분이 많아 ㅠ>

 


WRITTEN BY
테네시왈츠
항상 겸손하게 항상 새롭게 항상 진실하게

,

요즘들어 보안에 대한 프로그래밍을 많이 하게 된다.

하래서 한다만 과연 무엇을 위한 보안인지는 모르겠다. 그냥 하는거다.


DB연결자를 구성할때 최소한 서버IP, 사용자정보, 사용자 비밀번호 를 요구한다.

나같은 경우 보통 ini 파일안에 그 정보를 담아두곤 하는데 이 부분에 사용자 비밀번호가 노출돼 보안에 지적될 소지가 있어 암호화 처리하여 ini에 구성한 뒤 복호화 하여 DB Connection을 맺게 구성을 해야 할 것 같다.


그래서 준비해 보았다.



다음과 같은 화면으로 구성해 보았다.


언젠가 쓸 날이 있을거라 본다.


# frmMain.cs

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 _CS__Generator_Password

{

    public partial class frmMain : Form

    {

        //암호화 복호화 키 8글자 (필히 8자리여야 함)

        WATCrypt m_crypt;


        public frmMain()

        {

            InitializeComponent();

        }


        private void frmMain_Load(object sender, EventArgs e)

        {


        }


        private void btnApply_Click(object sender, EventArgs e)

        {

            if (txtKeyCode.Text.Length != 8)

            {

                MessageBox.Show("Only allows 8-digit");

                return;

            }


            //암호화 복호화 키 8글자 (필히 8자리여야 함)

            m_crypt = new WATCrypt(txtKeyCode.Text);


            txtKeyCode.ReadOnly = true;


        }


        private void btnEncryption_Click(object sender, EventArgs e)

        {

            if (txtKeyCode.ReadOnly == false)

            {

                txtKeyCode.Focus();

                return;

            }


            if (txtEncryption.Text == "")

            {

                txtEncryption.Focus();

                return;

            }


            // 암호화

            txtEncryption_Gene.Text = m_crypt.Encrypt(txtEncryption.Text);

        }


        private void btnDecryption_Click(object sender, EventArgs e)

        {

            if (txtKeyCode.ReadOnly == false)

            {

                return;

            }


            if (txtDecryption.Text == "")

            {

                txtDecryption.Focus();

                return;

            }


            // 복호화

            txtDecryption_Gene.Text = m_crypt.Decrypt(txtDecryption.Text);


        }


    }



}




# WATCrypt.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;
using System.IO;

namespace _CS__Generator_Password
{

    class WATCrypt
    {

        byte[] Skey = new byte[8];

        public WATCrypt(string strKey)
        {
            Skey = ASCIIEncoding.ASCII.GetBytes(strKey);
        }
        
        public string Encrypt(string p_data)
        {

            if (Skey.Length != 8)
            {
                throw (new Exception("Invalid key. Key length must be 8 byte."));
            }


            DESCryptoServiceProvider rc2 = new DESCryptoServiceProvider();

            rc2.Key = Skey;

            rc2.IV = Skey;

            MemoryStream ms = new MemoryStream();

            CryptoStream cryStream = new CryptoStream(ms, rc2.CreateEncryptor(), CryptoStreamMode.Write);

            byte[] data = Encoding.UTF8.GetBytes(p_data.ToCharArray());
            
            cryStream.Write(data, 0, data.Length);

            cryStream.FlushFinalBlock();
            
            return Convert.ToBase64String(ms.ToArray());

        }
        
        public string Decrypt(string p_data)
        {

            DESCryptoServiceProvider rc2 = new DESCryptoServiceProvider();
            
            rc2.Key = Skey;

            rc2.IV = Skey;
            
            MemoryStream ms = new MemoryStream();

            CryptoStream cryStream = new CryptoStream(ms, rc2.CreateDecryptor(), CryptoStreamMode.Write);

            byte[] data = Convert.FromBase64String(p_data);
            
            cryStream.Write(data, 0, data.Length);

            cryStream.FlushFinalBlock();
            
            return Encoding.UTF8.GetString(ms.GetBuffer());

        }

    }
}



WRITTEN BY
테네시왈츠
항상 겸손하게 항상 새롭게 항상 진실하게

,

문득 태블릿PC를 이용하여 품질데이터 관리 하는 기능의 일환으로 이미지 압축에 관련하여 한번 살펴 보았다.

아래 0 압축율은 이미지가 깨지므로 25L이 적당한것으로 테스트 되었다.


자 그럼 이제 카메라 구동기술을 알아보자. 한 3년은 걸릴거 같음 ㅋ


private void VaryQualityLevel()

{

    // Get a bitmap.

    Bitmap bmp1 = new Bitmap(@"c:\TestPhoto.jpg");

    ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Jpeg);


    // Create an Encoder object based on the GUID

    // for the Quality parameter category.

    System.Drawing.Imaging.Encoder myEncoder =

        System.Drawing.Imaging.Encoder.Quality;


    // Create an EncoderParameters object.

    // An EncoderParameters object has an array of EncoderParameter

    // objects. In this case, there is only one

    // EncoderParameter object in the array.

    EncoderParameters myEncoderParameters = new EncoderParameters(1);


    EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, 50L);

    myEncoderParameters.Param[0] = myEncoderParameter;

    bmp1.Save(@"c:\TestPhotoQualityFifty.jpg", jpgEncoder, myEncoderParameters);


    myEncoderParameter = new EncoderParameter(myEncoder, 100L);

    myEncoderParameters.Param[0] = myEncoderParameter;

    bmp1.Save(@"c:\TestPhotoQualityHundred.jpg", jpgEncoder, myEncoderParameters);


    // Save the bitmap as a JPG file with zero quality level compression.

    myEncoderParameter = new EncoderParameter(myEncoder, 0L);

    myEncoderParameters.Param[0] = myEncoderParameter;

    bmp1.Save(@"c:\TestPhotoQualityZero.jpg", jpgEncoder, myEncoderParameters);


}



// Image format에 대한 Codec 정보를 가져온다.

private ImageCodecInfo GetEncoder(ImageFormat format)

{


    ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();


    foreach (ImageCodecInfo codec in codecs)

    {

        if (codec.FormatID == format.Guid)

        {

            return codec;

        }

    }

    return null;

}


WRITTEN BY
테네시왈츠
항상 겸손하게 항상 새롭게 항상 진실하게

,

우선 테스트 하기 위해 내가 늘 사용하는 이 방법


닥치고 우선 신규 프로젝트를 하나 만들고 > 신규 폼 > 버튼 하나를 올려 놓자

그 위 버튼에 이벤트를 걸자!(버튼 더블클릭)


그 다음 소스는 아래 부분을 참조

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.Net.Mail;


namespace _CS__메일보내기

{

    public partial class Form1 : Form

    {

        const string SMTP_SERVER = "smtp.naver.com"; // SMTP 서버 주소

        const int SMTP_PORT = 587; // SMTP 포트


        const string MAIL_ID = "yhtmpresentz@naver.com"; // 보내는 사람의 이메일

        const string MAIL_ID_NAME = "yhtmpresentz"; // 보내는사람 계정 ( 네이버 로그인 아이디 ) 

        const string MAIL_PW = "xxxxxxxxxxxx";  // 보내는사람 패스워드 ( 네이버 로그인 패스워드 )


        public Form1()

        {

            InitializeComponent();

        }


        private void button1_Click(object sender, EventArgs e)

        {

            try

            {



                MailAddress mailFrom = new MailAddress(MAIL_ID, MAIL_ID_NAME, Encoding.UTF8); // 보내는사람의 정보를 생성

                MailAddress mailTo = new MailAddress("passion012@korea.com"); // 받는사람의 정보를 생성


                SmtpClient client = new SmtpClient(SMTP_SERVER, SMTP_PORT); // smtp 서버 정보를 생성


                MailMessage message = new MailMessage(mailFrom, mailTo);


                message.Subject = "CSDP000 테스트"; // 메일 제목 프로퍼티

                message.Body = "반갑습니다"; // 메일의 몸체 메세지 프로퍼티

                message.BodyEncoding = Encoding.UTF8; // 메세지 인코딩 형식

                message.SubjectEncoding = Encoding.UTF8; // 제목 인코딩 형식


                client.EnableSsl = true; // SSL 사용 유무 (네이버는 SSL을 사용합니다. )

                client.DeliveryMethod = SmtpDeliveryMethod.Network;

                client.Credentials = new System.Net.NetworkCredential(MAIL_ID, MAIL_PW); // 보안인증 ( 로그인 )

                client.Send(message);  //메일 전송 


            }

            catch (Exception ex)

            {

                MessageBox.Show(ex.Message);

            }

 

        }

    }

}





WRITTEN BY
테네시왈츠
항상 겸손하게 항상 새롭게 항상 진실하게

,

옮긴 회사가 델파이를 사용하다 보니 이전에 익숙했던 C#을 접할 기회가 거의 없다.

매번 느끼지만 각 프로그래밍언어를 옮기다 보면 변환 함수가 잘 떠오르지가 않아 애를 먹는 경우가 많다.


얼마전 프로그램에서 이번달 마지막 날짜를 구해야 하는 경우있어 델파이로 구현을 해 보다 문득 C#은 어떻게 구현을 할까 의문이 들었다. 그래서 오랫만에 C# 의 감을 느껴보고자 Visul Studio를 키고 동일한 내용의 값을 구현해 보았다.


우선 간단히 로직(?)을 설명하자면 

1. 지정한 날짜 기준에서 다음달 1일의 날짜를 구한다.

2. 다음달 1일 날짜에서 -1 해준다.

- 끝 -


곧바로 이번달 마지막 날짜를 구하는 함수가 C#에서 있는지 모르겠지만 현재로서는 그냥 이렇게 생각을 해 보았다.


1. 지정한 날짜 기준에서 다음달 1일의 날짜를 구한다.

            // "2016-03-01"

            string sFirstDay_of_NextMonth = DateTime.Now.AddMonths(1).ToString("yyyy-MM") + "-01";


2. 다음달 1일 날짜에서 -1 해준다.
            // "2016-02-29"
            string sLastDay_of_ThisMonth  = DateTime.Parse(sFirstDay_of_NextMonth).AddDays(-1).ToString("yyyy-MM-dd");

이런 내용이 되겠다.

자 그럼 응용해서 함수화 한다면 아래와 같이 구현할 수 있을것이다.

        private void Form1_Load(object sender, EventArgs e)
        {
            //// "2016-03-01"
            //string sFirstDay_of_NextMonth = DateTime.Now.AddMonths(1).ToString("yyyy-MM") + "-01";

            //// "2016-02-29"
            //string sLastDay_of_ThisMonth  = DateTime.Parse(sFirstDay_of_NextMonth).AddDays(-1).ToString("yyyy-MM-dd");

           
            string sTestData;
            // "2016-02-29"
            sTestData = GetLastDayOfThisMonth(DateTime.Now);
            // "2017-02-28"
            sTestData = GetLastDayOfThisMonth(DateTime.Parse("2017-02-12"));

        }
        
        /// <summary>
        /// 지정한 달의 마지막 날짜를 구함
        /// </summary>
        /// <param name="dtmDate"></param>
        /// <returns></returns>
        private string GetLastDayOfThisMonth(DateTime dtmDate)
        {
            string sFirstDay_of_NextMonth = dtmDate.AddMonths(1).ToString("yyyy-MM") + "-01";

            return DateTime.Parse(sFirstDay_of_NextMonth).AddDays(-1).ToString("yyyy-MM-dd");            
        }

2월이 들쑥날쑥 하니 예로 적당한 것 같다.

오랫만에 C#을 하니 그냥 마음이 편하다. 왠지 손에 맞는 연장을 든것처럼...
곧 C#으로 개발하는 날이 오겠지?




WRITTEN BY
테네시왈츠
항상 겸손하게 항상 새롭게 항상 진실하게

,


        private void grdData_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)

        {


            // RowPointPaint 이벤트핸들러

            // 행헤더 열영역에 행번호를 보여주기 위해 장방형으로 처리

            Rectangle rect = new Rectangle(e.RowBounds.Location.X,

                                e.RowBounds.Location.Y,

                                grdData.RowHeadersWidth - 4,

                                e.RowBounds.Height);


            // 위에서 생성된 장방형내에 행번호를 보여주고 폰트색상 및 배경을 설정

            TextRenderer.DrawText(e.Graphics,

                                (e.RowIndex + 1).ToString(),

                                grdData.RowHeadersDefaultCellStyle.Font,

                                rect,

                                grdData.RowHeadersDefaultCellStyle.ForeColor,

                                TextFormatFlags.VerticalCenter | TextFormatFlags.HorizontalCenter);

        }



WRITTEN BY
테네시왈츠
항상 겸손하게 항상 새롭게 항상 진실하게

,


        private void button1_Click(object sender, EventArgs e)
        {
            string sConn = "";

            sConn += "Data Source =                                                         ";
            sConn += "  (DESCRIPTION =                                                      ";
            sConn += "    (ADDRESS_LIST =                                                   ";
            sConn += "      (ADDRESS = (PROTOCOL = TCP)(HOST = xxx.xxx.xxx.xxx)(PORT = 1521)) ";
            sConn += "    )                                                                 ";
            sConn += "    (CONNECT_DATA =                                                   ";
            sConn += "      (SERVICE_NAME = AMES)                                           ";
            sConn += "    )                                                                 ";
            sConn += "  );User Id=mesmgr;Password=mesmgr;                                   ";

            string SQL = "SELECT SYSDATE FROM DUAL";

            OracleConnection conn = null;
            try
            {
                conn = new OracleConnection(sConn);
                conn.Open();
                OracleCommand comm = new OracleCommand(SQL, conn);
                comm.CommandType = CommandType.Text;

                OracleDataReader rs = comm.ExecuteReader();
                               
                while (rs.Read())
                {
                    MessageBox.Show("성공 : " + rs[0].ToString());
                }
                rs.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show("실패 : " + ex.Message);
            }
            finally
            {
                conn.Close();
            }


        }


WRITTEN BY
테네시왈츠
항상 겸손하게 항상 새롭게 항상 진실하게

,

테스트 해보아야 됨!


http://code.msdn.microsoft.com/office/How-to-Automate-control-23cd2a8f



// add PowerPoint namespace 

using PPt = Microsoft.Office.Interop.PowerPoint; 

using System.Runtime.InteropServices;



 Step4. Add Event Handle Codes in MainForm.cs file

 /// <summary> 

        /// Check whether PowerPoint is running  

        /// </summary> 

        /// <param name="sender"></param> 

        /// <param name="e"></param> 

        private void btnCheck_Click(object sender, EventArgs e) 

        { 

            try 

            { 

                // Get Running PowerPoint Application object 

                pptApplication = Marshal.GetActiveObject("PowerPoint.Application") as PPt.Application; 

 

                // Get PowerPoint application successfully, then set control button enable 

                this.btnFirst.Enabled = true; 

                this.btnNext.Enabled = true; 

                this.btnPrev.Enabled = true; 

                this.btnLast.Enabled = true; 

            } 

            catch 

            { 

                MessageBox.Show("Please Run PowerPoint Firstly", "Error", MessageBoxButtons.OKCancel, MessageBoxIcon.Error); 

            } 

            if (pptApplication != null) 

            { 

                // Get Presentation Object 

                presentation = pptApplication.ActivePresentation; 

                // Get Slide collection object 

                slides = presentation.Slides; 

                // Get Slide count 

                slidescount = slides.Count; 

                // Get current selected slide  

                try 

                { 

                    // Get selected slide object in normal view 

                    slide = slides[pptApplication.ActiveWindow.Selection.SlideRange.SlideNumber]; 

                } 

                catch 

                { 

                    // Get selected slide object in reading view 

                    slide = pptApplication.SlideShowWindows[1].View.Slide; 

                } 

            } 

        } 

 

        // Transform to First Page 

        private void btnFirst_Click(object sender, EventArgs e) 

        { 

            try 

            { 

                // Call Select method to select first slide in normal view 

                slides[1].Select(); 

                slide = slides[1]; 

            } 

            catch 

            { 

                // Transform to first page in reading view 

                pptApplication.SlideShowWindows[1].View.First(); 

                slide = pptApplication.SlideShowWindows[1].View.Slide; 

            } 

        } 

 

        // Transform to Last Page 

        private void btnLast_Click(object sender, EventArgs e) 

        { 

            try 

            { 

                slides[slidescount].Select(); 

                slide = slides[slidescount]; 

            } 

            catch 

            { 

                pptApplication.SlideShowWindows[1].View.Last(); 

                slide = pptApplication.SlideShowWindows[1].View.Slide; 

            } 

        } 

 

        // Transform to next page 

        private void btnNext_Click(object sender, EventArgs e) 

        { 

            slideIndex = slide.SlideIndex + 1; 

            if (slideIndex > slidescount) 

            { 

                MessageBox.Show("It is already last page"); 

            } 

            else 

            { 

                try 

                { 

                    slide = slides[slideIndex]; 

                    slides[slideIndex].Select(); 

                } 

                catch 

                { 

                    pptApplication.SlideShowWindows[1].View.Next(); 

                    slide = pptApplication.SlideShowWindows[1].View.Slide; 

                } 

            } 

        } 

 

        // Transform to Last page 

        private void btnPrev_Click(object sender, EventArgs e) 

        { 

            slideIndex = slide.SlideIndex - 1; 

            if (slideIndex >= 1) 

            { 

                try 

                { 

                    slide = slides[slideIndex]; 

                    slides[slideIndex].Select(); 

                } 

                catch 

                { 

                    pptApplication.SlideShowWindows[1].View.Previous(); 

                    slide = pptApplication.SlideShowWindows[1].View.Slide; 

                } 

            } 

            else 

            { 

                MessageBox.Show("It is already Fist Page"); 

            } 

        }


WRITTEN BY
테네시왈츠
항상 겸손하게 항상 새롭게 항상 진실하게

,