텍스트박스에서 엔터키 입력시 다음으로 넘어가는 이벤트입니다.


private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
       //엔터키를 눌렀을 때 다음 텍스트박스로 이동
       if (e.KeyChar == (char)Keys.Enter)
       {
             textBox2.Focus();
       }
 }

         private void textBox2_KeyDown(object sender, KeyEventArgs e)
         {
                 //엔터키를 눌렀을 때  확인버튼으로 이동
                 if (e.KeyCode == Keys.Enter)
                 {
                        button1.Focus();
                 }
          }

Textbox의 이벤트중에 KeyPress나 KeyDown을 사용해서 적용시킵니다.

 

.Focus() 메서드는 지정한 그 객체로 포커스를 이동시켜주는 명령입니다.

 

KeyPress와 KeyDown사용시 이벤트 핸들러 형식이 조금 다르기 때문에

 

if문에서 확인할 때 주의해야합니다 

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

할당문과 변수초기화  (0) 2018.06.29
상수(Constant)  (0) 2018.06.28
개념정리(namespace,class,main,object)  (0) 2018.06.28
[초보자용]버튼 클릭시 TextEdit, TextBox 내용 지우기  (0) 2018.06.15
C#이란  (0) 2018.05.28

저번시간에는 임의의 컬럼값과 데이터를 추가했습니다.

이번에는 추가된 데이터에 아래 그림과 같이 Row Number(순번)을 추가해보겠습니다.



<dxg:GridColumn x:Name="RowNumber" FieldName="순번">
                        <dxg:GridColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding RowData.RowHandle.Value}"/>
                            </DataTemplate>
                        </dxg:GridColumn.CellTemplate>
                    </dxg:GridColumn>


이렇게 필드이름과 바인딩을 추가해주시면 간단하게 화면에 출력할 수 있습니다.




행이 고정이 되어있기 때문에 아래 그림과 같이 한줄한줄에 대한 데이터(0~MAX)에 대해 순번 위치변동이 없습니다!





<추가사항>  I do start from one

1부터 시작하고 싶으실수도 있고 다른 번호로 시작하게 만들고 싶은 분들도 계실거라고 생각합니다.


그럴경우 IValueConverter 인터페이스를 사용해야 합니다.


쉽게 이해할 수 있도록 아래 그림을 참고하십시오.


< XAML >

<Window.Resources> <local:MyConverter x:Key="converter"> </local:MyConverter> </Window.Resources>

<dxg:GridColumn x:Name="RowNumber" FieldName="순번">
                        <dxg:GridColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding RowData.RowHandle.Value, Converter={StaticResource converter}}"/>
                            </DataTemplate>
                        </dxg:GridColumn.CellTemplate>
                    </dxg:GridColumn>



<C#>



public IValueConverter Converter { get; set; }



public class MyConverter : IValueConverter

    {


        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)

        {

            return (int)value + 0;  //+1일경우 1부터 시작 

        }


        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)

        {

            return value;

        }

    }



value +1값을 리턴하게 되면 1부터 시작하게 됩니다. 




이렇게 출력이 된다면 정상적으로 성공입니다. 수고하셨습니다 ^^

WPF에서 DevExpress그리드 컨트롤을 생성하고 컬럼과 데이터를 추가해보겠습니다.


DevExpress란 간단하게 설명하자면 .NET 기반 컴포넌트 라이브러리중 하나입니다. 국내에서는 무겁기로 소문나있지만 사용하는 곳이 꽤 많습니다. 해외에서는 굉장히 많이 사용중이라고 합니다. 개인이 구입하기에는 가격이 많이 부담스러우실 수 있습니다. 여러가지 화려한 시각적인 효과와 다양한 툴을 제공합니다.




[1]. 먼저 프로젝트를 생성한 후 그리드 컨트롤을 하나 만들겠습니다.

   <dxg:GridControl AutoGenerateColumns="AddNew" EnableSmartColumnsGeneration="True" >

            <dxg:GridControl.View>

                <dxg:TableView AllowPerPixelScrolling="True" ShowTotalSummary="True"/>

            </dxg:GridControl.View>

        </dxg:GridControl>



[2]. Model 코드와 ViewModel코드를 작성합니다.

//Model 코드 작성

    public class Customer

    {

        public string Name { get; set; }

        public string Country { get; set; }

        public int Visits { get; set; }

        public DateTime? Birthday { get; set; }


        public static List<Customer> GetCustomers()

        {

            List<Customer> people = new List<Customer>();

            people.Add(new Customer() { Name = "홍길동", Country = "KOREA", Visits = 4, Birthday = new DateTime(1980, 1, 1) });

            people.Add(new Customer() { Name = "임꺽정", Country = "KOREA", Visits = 2, Birthday = new DateTime(1966, 4, 15) });

            people.Add(new Customer() { Name = "제이나", Country = "ALLIANCE", Visits = 6, Birthday = new DateTime(1982, 3, 11) });

            people.Add(new Customer() { Name = "헬스크림", Country = "HORDE", Visits = 11, Birthday = new DateTime(1977, 12, 5) });

            people.Add(new Customer() { Name = "란두인", Country = "ALLIANCE", Visits = 8, Birthday = new DateTime(1956, 9, 5) });

            people.Add(new Customer() { Name = "럭스", Country = "DEMACIA", Visits = 5, Birthday = new DateTime(1990, 2, 27) });

            people.Add(new Customer() { Name = "신드라", Country = "Ionia", Visits = 21, Birthday = new DateTime(1965, 5, 5) });

            people.Add(new Customer() { Name = "다리우스", Country = "Noxus", Visits = 8, Birthday = new DateTime(1987, 11, 9) });

            people.Add(new Customer() { Name = "소라카", Country = "Ionia", Visits = 1, Birthday = new DateTime(1949, 6, 18) });

            people.Add(new Customer() { Name = "자르반4세", Country = "DEMACIA", Visits = 3, Birthday = new DateTime(1989, 1, 8) });

            people.Add(new Customer() { Name = "아리", Country = "Ionia", Visits = 4, Birthday = new DateTime(1972, 9, 14) });

            people.Add(new Customer() { Name = "뽀삐", Country = "DEMACIA", Visits = 6, Birthday = new DateTime(1989, 5, 7) });

            people.Add(new Customer() { Name = "드레이븐", Country = "Noxus", Visits = 19, Birthday = new DateTime(1971, 10, 3) });

            return people;

        }

    }


    //ViewModel 코드 작성

    public class MainWindowViewModel

    {

        public MainWindowViewModel()

        {

            this.Customers = Customer.GetCustomers();

        }

        public List<Customer> Customers { get; set; }

    }



[3]. DataContext를 연결해줍니다.




[4].그리드컨트롤에 ItemSource로 가서 아까 연결했던 DataContext를 연결해줍니다.




[5]. 마지막으로 정상적으로 출력되는지 결과를 확인합니다.


성공입니다~!   수고하셨습니다!






소프트웨어 공학에서 어플리케이션을 구성하는 여러 디자인 패턴들이 있습니다.

1. MVC(Model-View-Controller) 2. MVP(Model-View-Presenter) 3.MVVM(Mdoel-View-ViewModel)

모두 모델과 뷰 사이의 관계를 어떻게 처리할지를 고민한 결과로 나온 해결책입니다.

무엇인가 개발한다 함은 간단하게 이야기 하자면 데이터를 UI에 연결하는 일을 하는 것입니다.

대충 연결해 놓으면 원본 데이터의 구조 일부나 화면 일부가 변경된다거나 할때 데이터와 UI 상호 연관된 부분 때문에

수정이 어려워집니다. 데이터 일부만 다르고 같은 유사한 UI를 쓰는 화면이나, 원본 데이터는 같은데 UI만 다른식으로

표현해야 하는 경우에도 전부 다시 개발하거나 수정해야 할 가능성이 높아집니다.

그래서 UI(View)와 데이터(Model)를 어떻게든 분리하려고 합니다. 상호연계해야하기 때문에 일단 분리 후 어떤식으로든 연계할 것입니다.

이 연계방식이 어떠냐에 따라 MVC, MVP, MVVM으로 나뉘게됩니다.


각 디자인 패턴들에 대해 설명하기 전에 각각의 용어들에 대한 설명을 하겠습니다.

-Model-

- 데이터를 가지고 있는 객체입니다.

만약 View에서 어떤 데이터를 요청하면, 그에 해당하는 데이터를 컨트롤러를 통해 전달하며, 

데이터의 변동이 일어나면, 변동된 데이터로 갱신을 당하는 역할을 합니다.


-View-

- 사용자가 볼 화면 즉 프론트엔드 단으로 보면 될것입니다.

DB에서 추출한 데이터를 가지고 출력해주거나, 사용자의 입력을 받는 부분입니다.


-Controller-

- View와 Model을 조율하는 조율자 같은 역할이라고 보면됩니다.

Model의 데이터를 추가 및 삭제가 가능하며, 모델에 존재하는 데이터를 View 보내는 등 중간 매게체 역할을 합니다.


1. MVC(Model-View-Controller)

- 프론트엔드 부분과 백엔드 부분을 구분하여 개발하는 방식을 말합니다.

따라서 서로의 영향을 받지 않고 수정이 가능하며, 그 외에도 유지보수에 탁월하게 작용합니다. 


2. MVP(Model-View-Presenter)

- 이 디자인패턴의 핵심은 사용자인터페이스(View)와 비지니스 로직(Model)을 분리하고, 서로간의 상호작용을 다른 객체(Presenter)에 위임해 서로의 영향을 최소화 하는것에 있습니다. 이 패턴을 이용해서 Model과 View간의 결합도를 낮추면, 새로운 기능을 추가하거나 변경할 필요가 있을때 관련된 부분만 수정하면 되기 때문에 확장성이 좋아지며, 테스트코드를 작성하기 편리해지기 때문에 더 안전한 코드 작업이 가능해집니다. 


3. MVVM(Model-View-ViewModel)

화면(View)은 자기가 표현하고자 하는 속성값을 가지고 있는 ViewModel을 불러들여 UI에 출력합니다. ViewModel은 특정한 Data조회 모듈을 이용해 필요로 하는 자신의 속성값을 채웁니다. Model은 Data를 조회하는 부분을 담당하거나, Data를 조회해서 특정Model 또는 ViewModel를 만듭니다. 

예를 들어보겠습니다.

주소를 서울에서 인천으로 수정해봅시다.

텍스트박스에서 수정하고 저장을 누르면 인천으로 저장되어야 합니다. UI에서 저장을 누르면 UI는 변경된 텍스트값을 알고 있습니다. 

하지만 현재까지 vm이나 m(data처리객체)은 변경된 값을 모릅니다. 이런경우 MVC에서는 컨트롤러가 이미 뷰와 모델을 모두 참조로 가지고 있기 때문에 컨트롤러에서 텍스트받스의 값을 직접 m으로 넘겨줘서 저장하도록 합니다. 

컨트롤러에는 string addr = v.text주소; m.save(addr); 이런식의 코드가 존재하게 됩니다. 

만약 view가 변경되어서 텍스트박스의 이름이 바뀌거나 없어지면 어떻게 될까요?

컨트롤러 내부 코드중 v.text주소 라는 부분이 명시적으로 view에 의존하기 때문에 문제가 발생합니다.

mvvm패턴에서는 vm이 view에 의존하지 않고, view에서는 어차피 주소 출력하려면 vm을 접근해야한, 주소변경시에도 view가 직접 vm의 속성인 주소값을 변경해 주고 vm은 그저 자신의 속성 "주소"의 값을 m.save(this.주소); 이런식으로 처리하면 됩니다.

wpf로 개발할 경우 vm이 view에 의존하지 않고 서로 정보를 교환할 수 있도록 Data Binding 이나 Command Binding등의 기능을 기본적으로 제공합니다. wpf에서는 view와 viewmodel의 관계 설정을 위해 다른 코드를 할 필요없이 아래와 같이 데이터바인딩을 이용합니다

<TextBox Text = "{Binding 주소}"> 이 코드면 view에서 데이터를 출력하거나 수정하기 위한 모든 처리가 끝입니다.



WPF(Window Presentation Foundation)

- 위키백과 정의에 따르면 WPF는 윈도우기반 응용프로그램에서 사용자 인터페이스를 표시하기 위한 목적으로 마이크로소프트에서 만든 그래픽 서브시스템이라고 합니다. 과거 아발론(Avalon)이라는 코드명으로 불렸으며 최초의 닷네 프레임워크3.0의 일부분으로 발표되었습니다. 그리고 기존의 그래픽 장치 인터페이스 대신 DirectX를 사용합니다. WPF는 다양한 인터페이스 요소들을 정의하고 연결하기 위해 XML기반의 언어인 XAML을 채용하였습니다. WPF응용프로그램은 데스크탑에서 단독으로 실행될 수도 있고 웹사이트에 내장된 객체로 서비스될 수도 있습니다. WPF는 2D/3D 렌더링, 고정 및 가변무서, 타이포그래피, 벡터그래픽스, 실시간 애니메이션, 프리렌더링 미디어와 같은 여러가지 보편적인 사용자 인터페이스들을 통합하는 것을 목적으로 합니다. 이러한 요소들은 다양한 이벤트, 사용자 인터랙션, 그리고 데이터 바인딩에 기반하여 연결 및 처리될 수 있습니다.

간단히 정리해보자면

WPF 장점

- 여러 윈도우즈 어플리케이션들이 WPF로 개발되고 있다. 

- XMAL사용으로 디자이너와 개발자(C#)소통과 구분역할이 이전에 비해 쉬워졌다

- 하드웨어 가속(DirectX)이 지원된다.

- 도우즈어플리케이션뿐만 아니라 웹어플리케이션도 지원한다.

C#이란

- 마이크로소프트에서 개발된 객체 지향 프로그래밍 언어로써 Java나 C++와 비슷한 면들을 많이 가지고 있습니다.

C#을 이야기하자면 .NET프레임워크를 함께 이야기해야 할 정도로 C#은 .NET프레임워크를 이용하여 프로그래밍하는 대표적인 

언어입니다. C#은 윈도우 프로그래밍, 웹프로그래밍, 게임, 모바일 프로그래밍등 모든 영역에서 사용되는 범용 프로그래밍 언어입니다.


.NET Framework (닷넷 프레임워크)

마이크로소프트에서 개발한 윈도우 프로그램 개발 및 실행환경입니다. 네트워크작업, 인터페이스등의 많은 작업을 캡슐화하였고, 

공통언어 런타임 CLR(Common Language Runtime)이라는 이름의 가상머신위에서 작동합니다. 

자바의 JVM(Java Virtual Machine)이라고 생각하면 쉽습니다.  

CLRJVM의 차이에 대해 간단히 설명하자면 JVM은 자바만을 지원하는데 비해,

CLR은 공통 언어 중개 CIL(Common Intermediate Language)로 표현될 수 있는 모든 언어를 지원한다는 차이가 있습니다.  

CLRJVM 또 다른 개념적 차이는 자바코드는 JVM이 설치된 여러 플랫폼에서 동작하지만, 

닷넷코드는 CLR이 설치된 윈도우 플랫폼에서만 동작한다는 점입니다.

C#이나 VB컴파일러등이 만들어 낸 실행 파일은 운영체제가 이해할 수 없는 코드로 되어 있기 때문에 바로 실행할 수 없습니다. 

이런 .NET이 제공하는 언어들이 컴파일되면 IL(Intermediate Language)라는 중간 언어로 작성된 파일을 만들어 냅니다. 

그리고 이 어플리케이션이 실행 될 때 CLR이 중간 언어를 읽어들여 JIT(Just In Time) 컴파일하여 네이티브 코드로 만들어 실행합니다. 

왜 처음부터 바로 Native코드를 만들지 않고 CLR을 거쳐 2번의 컴파일을 하는것일까? 

.NET이 여러가지 언어를 지원하는데, 이 언어들이 모두 플랫폼에 최적화된 코드가 되게 하기 위함입니다.

컴파일 비용이 좀 부담스럽긴 하지만, Target 기계에 최적화되어 최고의 성능을 낼 수 있습니다.

(무조건 Native로 변형하면, 컴파일의 부담은 적지만, 모든 기계에서 최적화된 성능을 내지는 못한다.)

CLR은 JVM과 같이 예외처리를 도와주고, 언어간의 상속을 지원하며, COM과의 상호운영성을 지원하고, 가비지컬렉션도 지원합니다. 


이번에 윈도우10으로 바꾸면서 안드로이드스튜디오를 새로 설치하는 과정입니다. 

안드로이드 어플을 개발하기 위해서 제일 먼저 설치해야 할 것은 JDK설치입니다. 

※ JDK란 자바 개발 도구로써 썬 마이크로시스템즈에서 만든 자바 소프트웨어 개발 환경입니다. 

여기에는 자바 가상머신(JVM)과 컴파일러, 디버거, 그리고 자바 애플릿 및 응용프로그램 개발을 위한 도구들이 포함됩니다.



1. 자바 JDK 설치 
아래 링크로 접속합니다.


링크 : Java SE [다운로드]






- 링크를 클릭하게 되면 오라클 홈페이지로 접속이 되며 다운로드로 이동하게 됩니다. 

위 이미지와 같이 다운로드를 클릭합니다.



- 동의버튼(Accept License Agreement)을 클릭 후 윈도우 부분 다운로드를 시작합니다.





- 설치를 시작합니다.





- 모든 설치를 마친 후 JDK 환경 변수 설정을 시작합니다.





2. JDK 환경 변수 설정



- 내 PC의 마우스 오른쪽 버튼을 클릭해서 속성을 클릭합니다.



__________________________________________________________________________________________________________________________________________________________________


- 속성창이 열리면 왼쪽부분 고급시스템 설정을 클릭합니다.






- 시스템 속성 -> 고급탭에 하단부분 환경변수를 클릭합니다.




________________________________________________________________________________________________________________


- 새로 만들기를 클릭합니다.




 변수 이름 : JAVA_HOME

 변수 값 : 설치된 경로 




이어서, 시스템 변수의 Path 항목도 편집합니다.




- Path 클릭 후 편집을 클릭합니다.





- 새로 만들기를 클릭 후 설치된 경로를 적어줍니다.



윈도우 7과는 다르게 윈도우 10의 환경변수 편집창은 편리합니다.

이전에는 한 줄에 많은 경로가 다 표기되어서 헷갈릴수 있었는데

윈도우 10은 항목별로 구분이 되어있어서 매우 편리한거 같습니다.



이제 JDK가 제대로 설치되어 있는지 확인만 하면 끝!




3. JDK가 정상적으로 설치되었는지 확인!



- cmd를 검색하여 명령 프롬프트를 실행합니다.





- 위 이미지와 같이 정상적으로 출력된다면 모든 설치가 완료된 것입니다.



모든 과정을 완료하셨다면 안드로이드 개발을 위한 준비는 완료되었습니다.



1. 금액값이 있을 경우 콤마를 찍습니다

ㅡ : 기본제공함수

ㅡ : 데이터형식

ㅡ : 필드명(컬럼명)


Select REPLACE(CONVERT(VARCHAR,CONVERT(MONEY,Pay),1),'.00','')


결과값 (Pay에 5000000이 출력된 경우)

 5,000,000




2. 소수점 둘째자리까지 콤마를 찍습니다.


Select CONVERT(VARCHARCAST(Pay AS MONEY), 1)


결과값 (Pay에 5000000이 출력된 경우)

 5,000,000.00

필드의 형식과 숫자가 동일한 두 테이블간의 데이터를 복사하는 방법입니다.


◎ 다른DB에서 복사한 테이블을 

   현재 DB에 테이블과 데이터를 추가하는 경우(테이블 생성 + 테이블 복사)


Select * Into [추가 하려는 DB].[dbo].[추가 하려는 Table명] From 

              [    복사한DB   ].[dbo].[   복사한Table명   ] 


ex) Select * Into [Now].[dbo].[tbCode] From [Before].[dbo].[tbCode]



※중복 데이터에 대한 에러를 무시하는 방법

복사하려는 대상필드가 기본키로 지정되어 있는데 중복 레코드로 인하여 에러를 발생 시 처리방법.

INSERT ignore INTO 

'Programing > MS-SQL' 카테고리의 다른 글

MSSQL 사용자 정의 테이블(UserInfoTable) 데이터 넣기  (0) 2024.07.17
금액 값에 콤마(,) 찍기  (0) 2018.01.29
데이터베이스란?  (0) 2018.01.29

데이터베이스를 간단히 정리하면 '대용량의 집합을 체계적으로 구성해 놓은 것' 정도로 말할 수 있습니다. 

또한, 데이터베이스는 혼자서 사용하는 것이 아니라 여러명의 사용자나 시스템이 서로 공유가 가능해야만 합니다.



데이터베이스의 특징!​

1. 데이터의 무결성

- 데이터베이스 안의 데이터는 어떤 경로를 통해 들어왔든지 데이터에 오류가 있어서는 안됩니다.

2. 데이터의 독립성

- 데이터의 크기나, 저장소를 변경해도 기존의 프로그램은 전혀 영향을 받지 않아야

합니다.

3. 보안

- 데이터베이스 안의 데이터는 아무나 접근할 수 있는 것이 아니라, 허가된 사람만이 접근 할 수 있어야합니다.

4. 중복의 최소화

- 동일한 데이터가 여러개 중복되어 저장되지 않아야 합니다.​

+ Recent posts