SimpleButton 색상 변경


SimpleButton의 색을 변경하려면  LookAndFeel.StyleFlat, Ultra Flat 또는 Style3D로 설정해야합니다.


this.Exit_btn.LookAndFeel.Style = LookAndFeelStyle.Flat;

this.Exit_btn.LookAndFeel.UseDefaultLookAndFeel = false;

this.Exit_btn.Appearance.BackColor = Color.White;

this.Exit_btn.Appearance.Options.UseBackColor = true;



XtraMessageBox 기본출력


if (DialogResult.Yes == XtraMessageBox.Show("프로그램을 종료하시겠습니까?", "프로그램 종료!", MessageBoxButtons.YesNo, MessageBoxIcon.Stop))

{

        this.close();

}



[ 결과 이미지 ]


기본출력 이미지입니다. 

뭔가 색상과 글씨크기가 맘에 들지 않습니다.

그래서 자신이 원하는 디자인으로 바꿔보겠습니다.


DevExpress.XtraEditors.XtraMessageBox.AllowHtmlText = true; // Html사용

if (DialogResult.Yes == XtraMessageBox.Show("<size=10><color=blue>프로그램을 종료하시겠습니까?</color></size>", 

"<size=10>프로그램 종료!</size>", MessageBoxButtons.YesNo, MessageBoxIcon.Stop))

{

    this.close();

}


[ 결과 이미지 ]


Html을 사용하여 간단히 바꿔보았습니다.





[응용] DialogButton icon add 아이콘 추가


DialogButton에 Yes, No에 각각 아이콘을 추가해보겠습니다.

[1]. Form에 svgImageCollection 도구를 추가합니다.

.


[2]. From DevExpress Gallery를 클릭해서 사용할 아이콘들을 선택, 확인합니다.

 



[3]. Edit Collection에서 선택했던 아이콘을 확인합니다.




[4]. 코드작성

private void Exit_btn_Click(object sender, EventArgs e)

{

    DevExpress.XtraEditors.XtraMessageBox.AllowHtmlText = true;

    XtraMessageBoxArgs args = new XtraMessageBoxArgs();

    args.Caption = "<size=10><color=red>주의!</color></size>";   //제목 텍스트 

    args.Text = "<size=10>프로그램을 종료하시겠습니까?<size=10>";  // 내용 텍스트 

    args.Buttons = new DialogResult[] { DialogResult.OK, DialogResult.Cancel };

    args.Showing += Args_Showing;

    

    if (DialogResult.OK == XtraMessageBox.Show(args))

    {

        Application.Exit();

    }

}



private void Args_Showing(object sender, XtraMessageShowingArgs e)

{

    foreach (var control in e.Form.Controls)

    {

        SimpleButton button = control as SimpleButton;

        if (button != null)

        {

            button.ImageOptions.SvgImageSize = new Size(16, 16); //표시되는 아이콘 크기설정

            button.Font = new System.Drawing.Font(button.Font.FontFamily, 10); //버튼 폰트 크기설정

            //button.Height = 25; 

            switch (button.DialogResult.ToString())

            {

                case ("OK"):

                    button.ImageOptions.SvgImage = svgImageCollection1[0]; //Edit Collection에서 Itme에 첫번째 등록되있는 svg이미지를 불러온다

                    //button.Text = "네";  //버튼이름변경

                    break;

                case ("Cancel"):

                    button.ImageOptions.SvgImage = svgImageCollection1[1];

                    //button.Text = "아니오";

                    break;

                    }

                }

            }

        }


[ 결과 이미지 ]



[1]. DateTimestring으로 변환


DateTime myDateTime = DateTime.Now;


//DateTime을 string으로 변환

string myConvertDateTime = myDateTime.ToString("yyyy/MM/dd hh:mm:ss");

Label1.Text = myConvertDateTime;




[2]. DateTimePickerstring으로 변환


DateTimePicker myDateTime = new DateTimePicker();


//DateTimePicker를 string으로 변환

 Label1.Text = myDateTime .Value.ToString("yyyy/MM/dd hh:mm:ss");


'Programing > C#' 카테고리의 다른 글

[DevExpress] SimpleButton 색변경  (0) 2018.10.04
[DevExpress] XtraMessageBox DialogResult Settings  (0) 2018.10.04
아이디 등록시 특수문자 체크  (0) 2018.09.18
[DevExpress] WinForm WaitIndicator  (0) 2018.09.05
set, get 접근자  (0) 2018.06.29

정규식

- 정해진 패턴을 사용해서 일치하는 데이터 검색을 지원하는 표현식 


정규식을 이용해서 특수문자를 제거 또는 지정한 특수문자를 사용할 수 있습니다.

그리고 Regex클래스를 이용한다. using System.Text.RegularExpressions; 네임스페이스 필요


< 정규 표현식에 사용되는 특수 문자 >

1. '.' (점)

 - 임의의 한 문자를 의미합니다.

ex) f. c -> fac, fbc, frc ...

     . fc -> afc, bfc, rfc ...


2. '*'

 - 바로 앞의 문자가 없거나 하나 이상인 경우

ex) f*c  -> c, fc, fcc, fffc ...

    fps* -> fp, fps, fpss, fpsss ...


3. '+'

 - 바로 앞의 문자가 하나 이상인 경우

ex) f+c -> fc, ffc, fffc ...


4. '?'

 - 바로 앞의 문자가 없거나 하나뿐인 경우

ex) fp?s -> s, fps 두가지 표현이 유일


5. '^'

 - 바로 뒤에 문자열로 시작

ex) ^The... 뒷부분부터 공백까지 검사. -> The girl is, Theather

^.e -> he, me, request, settle ...


6. '$'

 - 바로 앞의 문자열로 종료

ex) a?bc$ -> eeabe, seebc, bc ...

+.e$ -> onthetoe, bctae, appetittle ... 


7. '[ ]'

 - [ ] 안에 있는 문자 중 하나( 범위의 경우 '-'로 지정합니다. )

ex) [ab]cd -> acd, bcd ...

     [ a-z ] -> 알파벳 소문자

     [a-zA-Z] -> 알파벳 소문자, 대문자

     [0-9] -> 숫자

    ^[a-zA-Z] 영문자로 시작

    ^[가-힣] 한글로 시작

     [^a-zA-Z0-9가-힣] 알파벳, 숫자, 힣 사이에 문자가 아닌게 있는지 확인


[Regex 클래스 적용]



아이디 등록시 특수문자가 불가능해야되기 때문에 체크를 해줘야 한다.



특수문자가 있는지 확인하기 위해서 string 정규식을 이용하여 특수문자를 뺀 문자를 받는다.

string idChecker = Regex.Replace(USER_ID.Text, @"[ ^0-9a-zA-Z가-힣 ]{1,10}", "", RegexOptions.Singleline);


그리고 원래의 string과 비교 후 다르면 에러메시지창을 띄운다.

if( USER_ID.Text.Equals(idChecker) == false )

{

USER_ID.Text.Remove( 0, USER_ID.Text.Length );

USER_ID.Text = "";

DXMessageBox.Show("특수문자, 공백은 허용되지 않습니다..");

}



아이디에 지정한 특수문자(&)를 넣고 싶은 경우에는 \&를 추가하면 된다.

string idChecker = Regex.Replace(USER_ID.Text, @"[ ^0-9a-zA-Z가-힣\& ]{1,10}", ""RegexOptions.Singleline);


'Programing > C#' 카테고리의 다른 글

[DevExpress] XtraMessageBox DialogResult Settings  (0) 2018.10.04
Datetime, DatetimePicker을 string으로 변환  (0) 2018.10.01
[DevExpress] WinForm WaitIndicator  (0) 2018.09.05
set, get 접근자  (0) 2018.06.29
할당문과 변수초기화  (0) 2018.06.29

WinForm WaitIndicator 추가방법


추가할 프로젝트 우클릭 -> Add DevExpress Item -> New Item -> Progress Indicator 추가



[ MouseClick_Event ] 부분에 추가


UserLookAndFeel.Default.SetSkinStyle("Office 2013 Dark Gray");// 사용할 디자인(여러가지 스타일이 있음 속성확인후 적용)

SplashScreenManager.ShowForm(null, typeof(Frm_WaitForm), true, true, false);   // 스크린출력    

SplashScreenManager.Default.SetWaitFormCaption("잠시기다려주세요...");   // 출력되는 메시지 입력

SplashScreenManager.CloseForm();  // 출력해제



기타 배경색, 폰트크기, 폰트컬러등등 속성에서 변경가능 

'Programing > C#' 카테고리의 다른 글

Datetime, DatetimePicker을 string으로 변환  (0) 2018.10.01
아이디 등록시 특수문자 체크  (0) 2018.09.18
set, get 접근자  (0) 2018.06.29
할당문과 변수초기화  (0) 2018.06.29
상수(Constant)  (0) 2018.06.28

WaitIndicator 적용방법



[ WaitIndicator.xaml ]

xmlns:dx="http://schemas.devexpress.com/winfx/2008/xaml/core
dx:ThemeManager.ThemeName="LightGray" >     //Wait 디자인 변경

    <dx:WaitIndicator Content="Loading..." DeferedVisibility="True">  
            <dx:WaitIndicator.ContentTemplate> 
                <DataTemplate> 
                    <StackPanel Orientation="Vertical"> 
                        <TextBlock FontSize="17" Text="잠시만 기다려주십시오." /> 
                        <TextBlock Text="{Binding}" /> 
                    </StackPanel> 
                </DataTemplate> 
            </dx:WaitIndicator.ContentTemplate> 
    </dx:WaitIndicator>


[ WaitIndicator.xaml.cs ]        추가부분

public static void ShowSplashScreen()

{

    if (!DevExpress.Xpf.Core.DXSplashScreen.IsActive)

    {

        DevExpress.Xpf.Core.DXSplashScreen.Show<WaitIndicator>();

    }

}


public static void CloseSplashScreen()

{

    if (DevExpress.Xpf.Core.DXSplashScreen.IsActive)

    {

        DevExpress.Xpf.Core.DXSplashScreen.Close();

    }

}


[ ButtonClick_Event ] 부분에 사용

WaitIndicator.ShowSplashScreen();

if (DevExpress.Xpf.Core.DXSplashScreen.IsActive)

{

        WaitIndicator.CloseSplashScreen();

 }




※정상적으로 작동되었는데 출력위치가 중앙이 아닐경우 WPF_UserControl이 아닌 윈폼으로 추가해야함.

WinForm으로 추가방법http://plzhoney.tistory.com/20?category=752079




set, get

 - set, get접근자는 각각 속성을 읽거나, 새 값을 할당할 때 사용됩니다. 정보은닉(information hiding)을 위해 클래스 내부에서만 사용할 수 있도록 private로 접근을 제한해 버립니다.


정보은닉이란

 - 간단히 설명하자면 클래스 내부의 필드나 메소드와 같이 객체가 가지고 있는 것들을 외부에서 접근하지 못하도록 숨기는 것을 말합니다. 우리가 클래스 설계를 할때 private나 public 등과 같은 접근 제한자를 통하여 특정 멤버를 공개할 것인지 공개하지 않을 것인지 지정해 줄 수 있습니다. 

왜 이런 작업을 하는 것일까요?

우리가 클래스 설계를 할때 수십에서 수백개에 달하는 필드(field) 프로퍼티(property)가 존재할 수 있습니다.

그러나 이러한 정보들을 외부로 모두 노출시켜버리면 우리가 설계한 클래스를 사용하는 사람의 입장에서는 상당히 곤록스러울 것입니다. 이럴때는 필요한 정보만을 외부로 노출시킬 필요가 있습니다. 또 다른 이유로는 안정성을 위해서 입니다. 객체 내부에서만 사용되는 필드나 메소드는 외부로 공개하면, 외부에서 이를 수정할 수 있기 때문에 안정성이 깨질 우려가 있기 때문입니다. 


public class Person

{

public String name;

public int age;

 

public Person() 

{

          // ...

      }

    // ...

}


위와 같이 Person이란 클래스가 있다면, 외부에서 name과 age를 수정할 수 있습니다. 

접근 제한자가 public으로 지정되어 있기 때문입니다. 그럼 우리는 name이나 age의 값을 신뢰할 수 있을까요? 

그렇기 때문에 name과 age필드의 접근 범위를 private로 제한해줍니다. 그럼 외부에서 이 속성을 변경할 수 없겠죠? 

그런데 프로그램을 만들다 보면, 내부에 있는 변수를 수정해야 할 상황이 벌어질 수도 있습니다. 

그럴때 쓰이는 것이 set, get 접근자입니다. get접근자만 존재한다면 읽을 수만 있으며, set접근자만 존재하면 쓸 수만 있으며, 

두 접근자가 모두 존재하면 읽을 수도 있고 쓸 수도있게됩니다.


using System;

 

namespace ConsoleApplication14

{

    public class MyClass

    {

        private string name = "John";

 

        public string Name

        {

            get

            {

                return name;

            }

            set

            {

                name = value;

            }

        }

    }

    class Program

    {

        static void Main(string[] args)

        {

            MyClass mc = new MyClass();

 

            Console.WriteLine("mc.Name : {0}", mc.Name);

 

            mc.Name = "Bree";

 

            Console.WriteLine("mc.Name : {0}", mc.Name);

        }

    }

}


mc.Name : John

mc.Name : Bree


Name이란 이름으로 get/set 접근자를 통해 name에 접근할 수 있으며, get 영역 내에서는 name의 값을 반환하고, set 영역 내에서는 name 속성에 value값으로 초기화 시킵니다. 여기서 value은 Name으로 넘어온 값이라고 생각하시면 됩니다. mc.Name이 아직까지는 John이었다가, 이름이 Bree로 바뀌고, 바뀐 이름을 출력하게 됩니다.


'Programing > C#' 카테고리의 다른 글

아이디 등록시 특수문자 체크  (0) 2018.09.18
[DevExpress] WinForm WaitIndicator  (0) 2018.09.05
할당문과 변수초기화  (0) 2018.06.29
상수(Constant)  (0) 2018.06.28
개념정리(namespace,class,main,object)  (0) 2018.06.28

할당문보다 변수초기화를 사용하는 편이 더 좋다 라고들 합니다.

그 이유에 대해서 생각해 보겠습니다.


[1번]

int a = 3;


[2번]

int b;

b=3;


1번식은 선언식 변수 초기화이고 2번식은 그냥 선언 후 변수할당문입니다.

여기서 말하는 할당문보다 변수 초기화를 사용하는 편이 더 좋다 라는 말은 2번식보다 1번식이 더 좋다는 뜻입니다.

그렇다고 언제나 1번식이 좋은건 아니므로 좋은 경우와 좋지않은 경우를 살펴보겠습니다. 


좋은경우

 - 클래스의 여러 생성자에서 멤버 변수를 항상 동일하게 초기화 할 경우


// -- case 1 : 여러 생성자에서 동일한 초기화를 하고자 할 경우

// -- 어떤 생성자라 할지라도 _list 는 처음부터 List<int>()를 할당하고 시작합니다.

    

private List<int> _list = new List<int>();

 

    public MyClass1(int a)

    {

        _list.Add(a);

    }

 

    public MyClass1(int a, int b)

    {

        _list.Add(a);

        _list.Add(b);

    }


 - 생성자에 상관없이 멤버변수를 초기화 하고자 할 경우


// -- case 2 : 생성자 유무에 관계 없이 초기화 하고자 할 경우

// -- 생성자가 없다 하더라도, 기본적으로 _list 는 할당 됩니다.


class MyClass2

{           

    private List<int> _list = new List<int>();



선언식 변수 초기화가 안좋은 경우는 언제일까요?

좋지않은 경우

- 멤버 변수가 생성자에 따라 다르게 설정해야 할 경우


// -- Bad Case 1 : 생성자에 따라, 멤버 변수를 다르게 설정해야 될 경우

// -- 예제에서 볼 수 있듯이 재할당 하므로 비효율 적입니다.

class BadCase1

{

    List<int> _list = new List<int>();

 

    BadCase1(int list_size)

    {

        // 재할당 ...

        _list = new List<int>(list_size);

    }

}


'Programing > C#' 카테고리의 다른 글

[DevExpress] WinForm WaitIndicator  (0) 2018.09.05
set, get 접근자  (0) 2018.06.29
상수(Constant)  (0) 2018.06.28
개념정리(namespace,class,main,object)  (0) 2018.06.28
[초보자용]버튼 클릭시 TextEdit, TextBox 내용 지우기  (0) 2018.06.15

상수(Constant)

 - 수천에서 수만줄이 넘어가는 프로그램을 만들게 될 때, 수많은 변수를 선언하여 코드를 작성하게 됩니다.

그러나 이 수많은 변수중 도중에 값이 변경되어도 프로그램엔 영샹을 미치지 않는 것과 도중에 변경되면 심각한 오류를 일으킬 수 있는 것들이 있습니다.

만약 코드를 작성하다가 나도 모르게 값을 변경하지 말아야할 변수를 건드리면 버그가 발생할 수 있습니다. 이때 이 문제를 해결해주는 const라는 키워드를 사용하면 됩니다. const를 사용하게 되면 한번 초기화된 값은 절대 변하지 않습니다. 상수를 정의하는 방법은 변수의 선언방법과 유사합니다.


using System;


namespace ConsoleApplication1

{

class Test

{

static void Main(string[] args)

{

const int a = 50;

a = 60; //오류

Console.WriteLine(a);

}

}

}

상수의 값은 변경이 불가능한 것을 확인할 수 있습니다. 그렇다면 아래와 같이 상수의 선언과 초기화를 분리하면 어떻게 될까요?

const int a;

a = 60; //오류

const의 특징을 정리해보면 선언과 동시에 초기화해야하며 초기화가 된 후에는 값의 변경이 불가능한 것을 알 수 있습니다.







namespace

 - 네임스페이스는 관련된 구조체, 클래스, 델리게이트, 인터페이스 등을 그룹화 한것을 말합니다.


class

 - 클래스는 크게 두가지로 나뉩니다. 필드(field)와 메소드(method)로 나뉘게 되는데 필드는 정적인 상태를, 메소드는 동적인 기능을 표현합니다.

독립적으로 존재할 수 있는 최소 단위, C#프로그램을 구성하는 기본단위이며, 이 하나의 클래스를 가지고도 여러개의 객체(object)를 만들어낼수있습니다.


main

 - static void main는 메소드(method)이며, 메인(main)메소드는 그중에서 가장 중요한 메소드입니다.

프로그램의 최초의 진입점(Entry Point)을 나타냅니다. 모든 프로그램에서 메인메소드는 반드시 존재해야하며, 메인 메소드가 시작되면 프로그램 시작되고

종료되면 프로그램도 같이 종료됩니다. 

static는 한정자로 정적인 메소드를 의미하며, void는 반환 형식으로 반환값이 없음을 의미합니다. 


object

 - 객체자료형(object)은 정수, 실수, 논리, 문자열등 모든 데이터를 담고 처리할 수 있습니다. 처리할 수 있는 이유는 상속관계 때문입니다.

부모에게 유산(데이터, 메소드)을 물려받은 자식은 부모가 가지고 있던 기능을 똑같이 수행할 수 있습니다.

object는 모든 자료형의 최상위 부모클래스, 즉 C#에서 모든 객체들은 object클래스로부터 상속을 받습니다.

한마디로 말하면 모든 자료형의 부모는 object다 라고 말할 수 있습니다.

'Programing > C#' 카테고리의 다른 글

할당문과 변수초기화  (0) 2018.06.29
상수(Constant)  (0) 2018.06.28
[초보자용]버튼 클릭시 TextEdit, TextBox 내용 지우기  (0) 2018.06.15
TextBox Enter Event 다음으로 이동  (0) 2018.06.15
C#이란  (0) 2018.05.28

+ Recent posts