-- SQL
구문7가지

 

 

-- DDL : 데이터정의어

-- DML : 데이터조작어

 

 

-- [1] 한줄메모장테이블생성: Memos

Create Table dbo.Memos

(

      Num Int Identity(1,1) Not Null Primary Key,    -- 번호

      Name VarChar(25) Not Null,                     -- 이름

      Email VarChar(50) Null,                        -- 이메일

      Title VarChar (150) Not Null,                  -- 메모(제목)

      PostDate DateTime Default(GetDate()),          -- 작성일

      PostIP VarChar(15) Null                        -- IP주소

)

Go

      

-- 형식: 필드명데이터형식제약조건

-- IDENTITY(속성)(Transact-SQL) : 테이블에ID 열을만듭니다. 이속성은CREATE TABLE ALTER TABLE Transact-SQL 문에사용됩니다.

-- 작성한코드를실행하려면작성한코드를마우스로블록잡아서"개체탐색기" 위에실행버튼을누르면되고, 제대로실행될경우에는아래창에"명령이완료되었습니다"라고메시지가출력된다.

-- 실행후"명령이완료되었습니다" 창을닫으려면"Ctrl + R"을누르면해제된다.

 

 

 

 

 

--[2] 테이블구조변경

-- Alter문을사용해서변경한다.

-- PostIP 컬럼을삭제하고싶다면???

Alter Table dbo.Memos Drop Column PostIP

Go

Alter Table dbo.Memos Add PostIP VarChar(15) Null

Go

 

-- Alter Table 명령어의"온라인도움말"을보고싶으면Alter Table을마우스를블록잡아서Shift + F1을같이누른다.

-- ALTER TABLE(Transact-SQL): 열과제약조건을변경, 추가또는삭제하거나파티션을재할당하거나제약조건과트리거를설정또는해제하여테이블정의를수정합니다.

-- 테이블을수정하고싶을때굳이길고어렵게쿼리문을작성하는방법보다는해당테이블의[디자인]을통해서쉽게편집하는방법을추천. 여기서는내가만든테이블인[dbo.Memos][개체탐색기] -[dbo.Memos] 마우스우클릭-> [디자인]을통해서쉽게편집하면된다.

 

 

 

 

 

--[3] 테이블구조삭제

-- Drop: 한번실행하면트랜젝션처리할때까지는절대로되돌리기할수없으니조심할것!

Drop Table dbo.Memos

Go

 

 

 

 

 

---[4] 테이블에데이터입력: Insert

Insert Memos(Name, Email,Title,PostDate,PostIP)

Values('제시카', 'h@h.com', '안녕.', GetDate(), '127.0.0.1')

Go

 

/*

Insert Into Memos(Name, Email, Title, PostIP)        -- Into는생략가능

Values('제시카', 'h@h.com', '안녕', '127.0.0.1')

Go

*/

 

 

 

--[5] 테이블에서테이터출력/조회: Select

Select * From Memos

Go

Select Num, Name, Email, Title, PostDate, PostIP

From Memos

Order By Num Desc -- 번호필드()에역순으로출력

Go

/*

Select * From Memos

Go

Select Num, Name, Email

From Memos

Where Num > 0

Go

*/

 

 

 

 

--[6] 테이블의테이터를수정: Update

Update Memos

Set

       Name = '김유진',

       Email = 'b@b.com'

Where

       Name = '제시카'

Go

/*

Update Memos

Set

       Name = '김유진'

Where

       Num = 1

Go

*/

 

 

 

--[7] 테이블의데이터를삭제: Delete

Delete Memos

Where Name = '김유진'

Go

/*

Delete Memos

Where Name Like '%'

Go

*/

 

 

 

 

 


'.NET프로그래밍 > SQL Server 2008' 카테고리의 다른 글

8. SQL 구문2 - Select문  (0) 2009.09.10
7. SQL 구문1 - Insert문  (0) 2009.09.10
5. Table(테이블)  (0) 2009.09.09
4. OLE DB 설정 : 원격 접속 테스트  (0) 2009.09.09
3. 사용자 관리  (0) 2009.09.09
Posted by holland14
:
 
  1. 테이블 : 데이터베이스에 실제로 데이터가 저장되는 공간
    1. (레코드) (필드,컬럼) 구성된 표형태로 데이터 보관 : 관계형 데이터베이스
  1. 명령어가 아닌 관리도구로 테이블 생성
    1. 한줄메모장 응용 프로그램 만든다면???
      1. Memos : 메모
        1. Num : 번호, 자동증가
        2. Name : 작성자
        3. Email : 이메일
        4. Title : 메모
        5. PostDate : 작성일, 자동입력


--> 아래 그림에서 "MyDatabase"라는 이름의 데이터베이스에 "Num", "Name", "Email", "Title", "PostDate"의 항목을 넣은 테이블을 생성하였으며 테이블의 이름은 테이블 작성 완료 후 마지막에 이름을 정할 때 "Memos"로 지정하였다. 그림 가운데 있는 테이블에서 "Null 허용"에 체크박스를 하지 않으면 'Null을 허용하지 않는다는 것'이므로 '데이터를 필수로 입력해야 한다'는 의미이다. 반대로 "Null 허용" 체크박스에 '체크'한 것은 'Null을 허용', 즉 '아무것도 입력안해도 상관없다는 것'을 설정해 주는 것이다. 테이블의 "데이터 형식"에서는 각 형식에 맞게 데이터타입(int, varchar 등...)과 입력할 수 있는 최대 데이터크기(25, 100, 150 등...)를 지정해 주면 된다. 테이블의 아래에 있는 [열 속성]그림은 "Num"의 "ID 사양"을 변경하였는데, [ID 사양] -> [(ID)]를 "예"로 설정하면 바로 위의 [ID 사양]도 "예"로 바뀌고 아래의 [ID 증가값]과 [ID 초기값]이 1로 바뀐다.(이 과정은 "Num"의 [ID 사양]을 "예"로 하여 "Num 속성"을 활성화 시키고, "Num"의 초기값을 "1"로 설정하고, 증가값도 "1"씩 자동으로 증가하도록 설정해 준것이다.

--> 테이블 맨 아래에 있는 항목인 [PostDate]도 "Null"허용 체크박스에 체크해 주었고 아래의 [열 속성]에서 [데이터 형식]은 '콤보박스'를 클릭하여 "datetime"으로 설정하고, 바로 윗칸에 있는 [기본값 또는 바인딩]은 "getdate()"로 입력했는데, 이것은 출력시에 컴퓨터의 현재시간을 가져와서 테이블의 " PostDate"셀에 자동입력되어 표시되도록 설정한 것이다.

--> 그리고 테이블의 첫번째 항목인 "Num"을 보면 왼쪽 옆에 "열쇠 그림"으로 체크가 되어 있는 것이 보인다. 이것은 그림 왼쪽에 있는 [개체 탐색기] 바로 위에 "열쇠 그림"을 체크해서 설정된 것인데, 이 "열쇠 그림"은 "기본키"를 설정해 주는데, 이는 테이블 내에서 같은 이름의 데이터가 존재할 때 중복되는 것을 방지해 주는 식별자 역할을 하는 것이다. 예를 들어 이 그림에 있는 한 개의 테이블에서 "홍길동"이라는 이름의 데이터가 2개 존재한다면 "기본키 설정"을 체크하여 중복을 방지하면 되는 것이다. 




--> 테이블에 데이터를 입력한 후에 파일이름을 "Memos"로 지정한 후 '확인'버튼을 누르면 [개체 탐색기]의 [데이터베이스] - [MyDatabase] - [테이블]안에 [dbo.Memos]라는 테이블형식의 파일이 만들어 진것을 볼 수 있다. --> [dbo.Memos] 마우스 우클릭 -> [상위 200개 행 편집]을 클릭하면 [dbo.Memos]테이블에 입력한 데이터가 아래와 같이 출력된다. 위의 테이블에서 "Email"과 "PostDate"의 "Null 허용"체크박스에 체크를 하였는데 "Email"과 "PostDate"항목은 데이터를 입력하지 않아도 상관없으며, 만약 이 2개의 항목에 데이터를 입력하지 않으면 출력되는 테이블에는 해당항목셀에 "NULL"이라고 표시된다. 







Posted by holland14
:
 

OLE DB 설정 : 원격 접속 테스트

    1. DB접속을 위한 4가지 필수 조건(항목) : 커넥션 스트링(Connection String)
      1. Server / Data Source
      2. Database / Initial Catalog
      3. User ID / Uid
      4. Password / Pwd
    1. 데이터베이스 연결문자열 : 닷넷 프로그래밍에서 필요
      1. ConnectionString = "Server=(local)\SQLExpress;Database=MyDatabase;User ID=My;Password=Pa$$w0rd;";
      2. ConnectionString="Data Source=(local)\SQLExpress;Initial Catalog=MyDatabase;uid=My;pwd=Pa$$w0rd;";
    1. UDL 파일을 만들어서 데이터베이스 연결문자열을 생성
      1. *.txt -> 확장자를 *.udl 변경 -> 속성 -> 4가지 정보 기록 저장 -> udl 파일을 노트패드로 열면 데이터베이스 연결문자열을 얻을 있다.
        1. ASP3.0까지는(.NET 이전버전) Provider 사용
        2. ASP.NET 이후로(.NET 이후버전) Provider 제외해서 사용


          

           
          ** 추가 참고자료

          "MyDatabase"라는 DB에 접근하려면 아래에서 4가지 정보가 필요하다.

          [oledb]

          ; Everything after this line is an OLE DB initstring
          Provider=SQLOLEDB.1;Password=rkfcl;Persist Security Info=True;User ID=My;Initial Catalog=MyDatabase;Data Source=(local)\SQLExpress

           

           

           

           



          
Posted by holland14
:
 
  1. 사용자관리 : 로그인 사용자
      1. Windows Server 최고관리자 : Administrator
      2. SQL Server 최고관리자 : sa
      3. 일반 계정(모든 기능할 수 가질 수 있는 계정만들기)
        1. 아이디 : My
        2. 암호 : Pa$$w0rd
        3. 권한 : MyDatabase 모든권한(db owner)

 



** 참고용 추가 필기

- Sql Server 구성관리자-SQL Server서비스에서 SQL Server(MSSQLSERVER)실행중이어야 함
- 데이터베이스-보안-로그인-우클릭-새 로그인-아이디,암호,어떤DB,어떤권한(4가지)정해줌. 중요!

- 주의! 해당데이터베이스-보안-사용자 절대 아님!
- 사용자매핑에서 권한 부여 db_owner
- 연결메뉴 클릭해서 데이터베이스엔진
- SQL Server인증선택하고 새롭게 만든 아이디, 패스워드로 들어가기
- 관리는 sa나 Administrator로 들어와서 관리
- Createuser등 명령어로 만들기 가능




 



 

Posted by holland14
:
 
  1. Database : 데이터(Data) 모아 놓는 캐비닛 역할을 하는 파일시스템
    1. 하나의 데이터베이스(파일) 여러 개의 테이블(레코드들의 집합) SQL 개체들을 모아서 하나의 이름으로 관리할 있는 구조
    2. 예를 들어, 닷넷코리아 사이트의 모든 정보는 DotNetKorea.MDF 파일에 모두 저장되어져 있다. 공지사항, 자유게시판, 회원정보
    3. 데이터 저장
      1. 텍스트 파일에 보관
      2. DB 데이터를 보관 - SQL구문을 이용해 쉽게 저장 및 불러오기 가능.
      3. XML 데이터를 보관
  1. 확장자
    1. MDF : Primary : 실제 데이터
    2. LDF : Log : 로그파일 - 셋업파일, 설정 정보
    3. NDF : Secondary : MDF파일과 동일하지만 물리적으로 파일을 따로 보관하고 싶을 때 사용. C드라이브와 D,E,F...드라이브로 나눠서 저장 가능
  1. 데이터베이스 생성
    1. DB : Hawaso, DotNetKorea, VisualAcademy,…,RedPlus,
      1. MyDatabase 생성

 


 ** 참고용 추가 필기

- 데이터베이스 생성시 필요한 요소 : 이름(회사명, 주제, 사이트명, 프로젝트명, 관리자 등), 호스트 업체에서는 사이트 이름으로 만듬. 

- 기본으로 설치 했을 경우 C드라이브-Program Files-Microsoft SQL Server-MSSQL10.SQLEXPRESS-MSSQL-DATA 경로에 새 데이터 베이스 저장됨
(.mdf 파일과 .ldf 파일이 저장) 

- 데이터베이스 생성하기 : 데이터베이스-우클릭-새데이터베이스

- 명령어로 데이터베이스 생성하기 : Create 명령어 : master데이터베이스에서 새쿼리 클릭

--명령어로 데이터베이스 만들기
Create Database MyDatabaseTwo
Go


- 위의 코드 작성후 블록으로 잡아서 !실행

- Create 명령어는 사용빈도 적지만 뒤에 나오는 Select, Delete 등의 명령어는 많이 사용한다.

 


 

Posted by holland14
:
 
  1. 설치 환경구성
    1. 다운로드 : http://www.microsoft.com/express/sql/download/
      1. SQL Server 2008 Express 버전 : 무료
      2. SQL Server 2008 Standard 버전 : 상용
    1. 설치 동영상
      1. http://www.hawaso.com/JeilStudy/BoardList.asp?BoardName=Sample
    1. 엔진이름 : (local) == 서버명 == IP주소( 컴퓨터를 나타냄)
      1. SQL Express : (local)\SQLExpress
      2. SQL Standard 이상 : (local)
        1. (local) 사용 가능
        2. (local)\원하는이름
          1. (local)\RedPlusSql
      1. SQL Server 삭제(?) : MSDN 검색
    1. 설치후 확인
      1. 인증 : Windows 인증 -> SQL Server 혼합 인증 변경
      2. sa 사용자 : 로그인 허용




** 참고용 추가필기

ㄱ.
       ex) (local)\RedPlusSql
         SQL이름을 정확히 알아야 함. DB연동 시 필요
  익스프레스버전:(local)\SQLExpress :  Visual Studio는 기본적으로 익스프레스엔진을 사용(Visual Studio를 설치하면 SQL Server Expresee버전 엔진이 설치된다.)

ㄴ.
 - 설치 중 기능 선택시 주의 : 엔진, 관리도구, 온라인 설명서 정도만 설치해도 됨
 - 서비스계정 : 엔진 수동이면 컴퓨터 껐다 키면 sql서버 중지됨. 자동이면 sql서버가 컴퓨터 킬 때 마다 시작됨
 - 실제 서버라면 시작 유형을 자동으로 선택
 - 데이터베이스 엔진 구성에서 인증 모드 중요.
 -  개발자를 위한 인증 모드는 무조건 혼합 모드로 함
 - 삭제하려면 msdn 검색
 

 <반드시 확인해야 할 2가지>
  1) 인증변경 : 엔진 마우스 오른쪽 클릭-속성-보안-SQL Server 및 Windows 인증 모드로 변경
  2) 보안-로그인-sa-우클릭-속성-상태-데이터베이스엔진연결권한허용,로그인사용으로 체크 (반드시 주의!)

Posted by holland14
:

"주소록의 Setup파일 생성하기"도 앞서 했던 "DotNetCalc의 Setup파일 생성하기"의 과정과 거의 동일하다. "주소록의 Setup파일 생성하기"에서는 아주 조금만 다르게 Setup파일을 생성한다.


이전에 만들었던 "주소록"프로젝트(주소록.sln)를 열어서 --> [파일] -> [추가] -> [새 프로젝트] 클릭 --> [새 프로젝트 추가] 창에서 '프로젝트 형식'을 [기타 프로젝트 형식]으로 선택하면 [설치 및 배포] 선택 --> 오른쪽 창의 'Visual Studio에 설치되어 있는 템플릿'에서 [설치 프로젝트] 선택하고 파일'이름'은 "AddressSetup"으로 하고 저장'위치'는 "C:\...\주소록"으로 지정한 후 '확인'버튼 클릭

--> 생성된 [파일 시스템 (AddressSetup)] 창에서 [응용 프로그램 폴더]에 마우스 우클릭 ->[추가] ->[폴더] 클릭하고 '새 폴더'의 이름은 [주소록]으로 지정한다. --> [사용자 프로그램 메뉴]에도 [응용 프로그램 폴더]에서 "새 폴더"를 추가했던 방식과 똑같은 방식으로 '새 폴더'를 추가하여 이름은 [Psh주소록]으로 지정한다. --> [사용자 바탕 화면]에서는 "새 폴더"를 추가하지 않는다.

--> [응용 프로그램 폴더]의 [주소록]폴더를 마우스로 선택한 후 오른쪽에 있는 창을 '우클릭'하여 [추가] -> [프로젝트 출력] 클릭 -->[프로젝트 출력 그룹 추가]창에서 "기본 출력/지역화된 리소스/디버그 기호/콘텐츠 파일/소스 파일/문서 파일/XML Serialization 어셈블리"를 마우스로 모두 긁어서 선택하고 '확인'버튼 클릭하면 다음과 같이 나온다.



--> 위 그림의 오른쪽 창에서 "주소록의 기본 출력"파일은 실행파일인 "exe"파일과 같으며 "주소록의 소스 파일"은 "Program.cs"와 같은 "*.cs"파일과 같다. 여기서는 [프로젝트 출력]으로 파일을 추가하는 방식을 사용한 점이 앞에서 해봤던 "DotNetCalcSetup"프로젝트에서 [응용 프로그램 폴더]의 하위폴더에 파일을 추가한 방식([추가] -> [파일] 클릭)과 다른점이다. 그리고 여기서는 [프로젝트 출력 그룹 추가]창에서 모든 항목을 선택해서 모든 파일이 [응용 프로그램 폴더]의 [주소록]폴더에 추가된 것이다.

--> [솔루션 탐색기]에서도 "AddressSetup"파일 내에 모든 파일이 추가된 것을 볼 수 있다.


--> [사용자 프로그램 메뉴]의 [Psh주소록]에서는 "바로가기"만 하나 만들건데 --> [사용자 프로그램 메뉴]의 [Psh주소록]을 마우스로 선택한 후 오른쪽에 있는 창을 '우클릭'하여 [새 바로 가기 만들기] 클릭 --> [프로젝트에서 항목 선택] 창에서 '찾는 위치'를 [응용 프로그램 폴더] -> [주소록] -> [주소록의 기본 출력(활성)]을 선택하고 '확인'버튼 클릭하면 "주소록의 기본 출력(활성) 바로 가기"로 초기이름이 설정될 때 "주소록"으로 바로가기 '이름' 변경

--> [파일 시스템(AddressSetup)]의 [사용자 바탕 화면]에서는 하위에 "새 폴더" 추가하지 않고 바로 "바로가기"를 만들건데 --> [사용자 바탕 화면]을 마우스로 선택한 후 오른쪽에 있는 창을 '우클릭'하여 [새 바로 가기 만들기] 클릭 --> [프로젝트에서 항목 선택] 창에서 '찾는 위치'를 [응용 프로그램 폴더] -> [주소록] -> [주소록의 기본 출력(활성)]을 선택하고 '확인'버튼 클릭하면 "주소록의 기본 출력(활성) 바로 가기"로 초기이름이 설정될 때 "Psh주소록"으로 바로가기 '이름' 변경(윗단락에서 만든 바로가기인 "주소록"바로가기와 지금 만든 "Psh주소록"바로가기의 이름은 다르지만 같은 파일(바로가기)이다.)

--> 윗단락까지는 "DotNetCalcSetup"파일만들기와 거의 비슷한데, "주소록"프로젝트에서는 여기에 더하여 "아이콘(Icon)"파일을 만들어서 폼과 바로가기에 아이콘그림이 삽입되어 보여지도록 할 것이다. 우선 이제 만들 아이콘 파일을 이전에 만들었던 "주소록"프로젝트에 추가한다.

. "아이콘(Icon)"파일 만들기(파일이름은 "Address.ico"로 지정)



--> 위 그림에서 "새 항목"을 추가하면 아래 그림과 같이 "새 항목 추가 - 주소록"창이 나오고 여기서 '템플릿'에서 "아이콘 파일"을 선택 후 파일이름을 "Address.ico"로 지정 후 "추가"버튼 클릭 



--> [솔루션 탐색기]의 "주소록"프로젝트에 저장한 "Address.ico"파일이 추가된 것을 볼 수 있다.



--> 아래 그림과 같이 아이콘 이미지를 그린 후 저장한다. (그림에서 "16 * 16  4비트"그림은 '폼'의 타이틀바 및 '윈도우즈 [시작]키'에서의 [사용자 프로그램 메뉴] - [Psh주소록]폴더내에 "[주소록]바로가기"아이콘에 들어가는 이미지이며 / "32 * 32  4비트" 그림은 바탕화면의 "[Psh주소록]바로가기"아이콘에 들어가는 이미지이다. 여기서는 16 * 16, 32 * 32 모두 그림을 똑같이 그렸다.)



. "주소록"프로그램 폼(MainForm.cs [디자인])의 속성에 내가 만들어서 저장한 "Address.ico"아이콘 파일을 넣어서 "주소록"프로그램 실행시 폼의 Title출력되는 곳에 저장한 아이콘 출력하기

--> MainForm.cs [디자인]에서 "속성"에서 "Icon"속성을 클릭하여 들어가면 -->"열기"창이 뜨는데 내가 만들어서 저장한 아이콘파일(Address.ico)이 저장된 위치(C:\...\주소록\주소록\Address.ico)를 찾아서 선택하여 "열기"버튼 클릭 --> MainForm.cs [디자인]에서 '폼'을 클릭하고 실행(F5)해보면 아래 그림과 같이 '폼'의 타이틀바에 '아이콘이미지'가 나온다.




. "폼의 타이틀바" 에 아이콘이미지 추가하기를 실행해보았으니, 이번에는 '윈도우즈 [시작]키'에서의 [사용자 프로그램 메뉴] - [Psh주소록]폴더내에 "[주소록]바로 가기" 아이콘에 이미지 추가와 / 바탕화면의 "[Psh주소록]바로 가기"에 "아이콘 이미지" 추가하기.

--> [파일 시스템]에서 [응용 프로그램 폴더] - [주소록]을 마우스로 선택하고 오른쪽 창 우클릭 -> [추가] -> [파일] 클릭 -> [파일 추가]창에서 "C:\...\주소록\주소록\Address.ico"선택하여 '열기'버튼 클릭하면 아래그림과 같이 "Address.ico"파일이 오른쪽 창에 추가된 것을 볼 수 있다.



--> [파일 시스템]에서 [사용자 프로그램 메뉴] - [Psh주소록]을 마우스로 선택 후 오른쪽 창에 있는 [주소록](바로 가기) 마우스로 선택하면 [속성]창 -> [Icon]에서 "(찾아보기..)"클릭 -> [아이콘]창 에서 "찾아보기"버튼 클릭 -> [프로젝트에서 항목 선택]창에서 [응용 프로그램 폴더] -> [주소록] -> "Address.ico"선택 후 '확인'버튼 클릭하면 -> 다시 [아이콘]창에서 선택한 아이콘이미지(Address.ico)가 나오며 이를 선택하고 '확인'버튼 클릭하면 아래그림과 같이 [Icon]속성창에 아이콘이미지가 추가된다.



--> [파일 시스템]에서 [사용자 바탕 화면]에도 바로 위에서와 똑같이 아이콘 이미지를 추가한다. -> [파일 시스템]에서 [사용자 바탕 화면]을 마우스로 선택 후 오른쪽 창에 있는 [Psh주소록](바로 가기) 마우스로 선택하면 [속성]창 -> [Icon]에서 "(찾아보기..)"클릭 -> [아이콘]창 에서 "찾아보기"버튼 클릭 -> [프로젝트에서 항목 선택]창에서 [응용 프로그램 폴더] -> [주소록] -> "Address.ico"선택 후 '확인'버튼 클릭하면 -> 다시 [아이콘]창에서 선택한 아이콘이미지(Address.ico)가 나오며 이를 선택하고 '확인'버튼 클릭하면 윗그림과 같이 [Icon]속성창에 아이콘이미지가 추가된다.(다만 아이콘이미지를 추가하는 파일(위치)만 다를 뿐이다.) --> 이로써 "Address.ico"파일 이미지를 '윈도우즈 [시작]키'에서의 [사용자 프로그램 메뉴] - [Psh주소록]폴더내에 "[주소록]바로 가기"와 / 바탕화면의 "[Psh주소록]바로 가기"에 추가하는 과정은 끝났다.


. "빌드"를 해서 "AddressSetup"실행(exe/msi)파일 생성하고 "AddressSetup"파일을 실행하여 "주소록 프로그램"설치 및 "Address.ico"파일 이미지가 '윈도우즈 [시작]키'에서의 [사용자 프로그램 메뉴] - [Psh주소록]폴더내에 "[주소록]바로 가기"와 / 바탕화면의 "[Psh주소록]바로 가기"에 추가된 것 확인하기.

--> [솔루션 탐색기]에서 [AddressSetup] 마우스 우클릭 -> [빌드] 클릭하면 아래그림과 같이 "AddressSetup.msi" 파일과 "setup.exe"파일이 C:\주소록\AddressSetup\Debug폴더에 생성된다.



--> "AddressSetup.msi" 파일 또는 "setup.exe"파일을 실행하여 "주소록 프로그램"바로 가기를 아래그림과 같이 생성한다.





-->바탕화면에 "[Psh주소록]바로 가기"가 설치 된 화면(아이콘이미지도 추가되었음.)


--> '윈도우즈'[시작] - [모든 프로그램] - [Psh주소록]폴더에 "[주소록]바로 가기"가 설치 된 화면(역시 아이콘이미지가 추가된 것을 볼 수 있다.) 


--> "바탕화면"에 있는 "[Psh주소록]바로가기"나 "'윈도우즈'[시작] - [모든 프로그램] - [Psh주소록]에 "[주소록]바로 가기"를 실행하면 아래그림과 같이 "주소록 프로그램 V0.1"이 실행된다. 




// 참고

--> [내 컴퓨터] - [제어판] - [프로그램 추가/제거]에 설치되어있는 "AddressSetup"파일을 제거하면 "바탕화면"에 있는 "[Psh주소록]바로가기"가 삭제되고 / '윈도우즈'[시작] - [모든 프로그램]에서도 [Psh주소록]폴더가 삭제되는데, "C:\주소록\AddressSetup\Debug폴더"에 생성되었었던 "AddressSetup.msi" 파일과 "setup.exe"파일은 남아있는다.




Posted by holland14
:

지난번에 만들었던 간단한 계산기 프로그램인 "DotNetCalc"프로젝트(DotNetCalc.sln)를 열어서 --> [파일] -> [추가] -> [새 프로젝트] 클릭 --> [새 프로젝트 추가] 창에서 '프로젝트 형식'을 [기타 프로젝트 형식]으로 선택하면 [설치 및 배포] 선택 --> 오른쪽 창의 'Visual Studio에 설치되어 있는 템플릿'에서 [설치 프로젝트] 선택하고 파일'이름'은 "DotNetCalcSetup"으로 하고 저장'위치'는 "C:\...\DotNetCalc"로 지정한 후 '확인'버튼 클릭

-->생성된 [파일 시스템 (DotNetCalcSetup)] 창에서 [사용자 바탕 화면]에 마우스 우클릭 ->[추가] ->[폴더] 클릭하고 '새 폴더'의 이름은 [DotNetCalc]로 지정한다. [사용자 바탕 화면] 아래에 있는 [사용자 프로그램 메뉴]와 [응용 프로그램 폴더]도 같은 방식으로 '새 폴더'를 추가하여 폴더이름도 동일하게 [DotNetCalc]로 한다.

--> [응용 프로그램 폴더]의 [DotNetCalc]를 마우스로 선택한 후 오른쪽에 있는 창을 '우클릭'하여 [추가] -> [파일] 클릭 --> [파일 추가] 창에서 C:\...\DotNetCalc폴더에서 [bin] -> [Debug]폴더 내의 DotNetCalc.exe 파일을 선택하여 "열기"버튼 클릭(이 과정을 통해 "응용 프로그램 폴더" 내에 실행파일인 "exe파일"이 추가된 것이다.  이것은 보통 프로그램을 깔면 C드라이브의 "Program Files"폴더 안에 '해당프로그램 폴더'와 '그 폴더 안에 exe파일'이 들어있는 것과 같은 원리라고 할 수 있다.)

--> [사용자 프로그램 메뉴]의 [DotNetCalc]폴더 마우스로 선택한 후 오른쪽에 있는 창을 '우클릭'하여 [새 바로 가기 만들기] 클릭 --> [프로젝트에서 항목 선택] 창에서 '찾는 위치'를 [응용 프로그램 폴더] -> [DotNetCalc] -> [DotNetCalc.exe] 선택하고 '확인'버튼 클릭하면 "DotNetCalc.exe 바로 가기"로 초기이름이 설정될 때 "DotNetCalc"로 이름 변경(이 과정은 '윈도우즈'의 "시작"버튼 - "모든 프로그램"을 클릭하면 나오는 '폴더'로 들어있는 "(프로그램)바로가기"와 폴더없이 아이콘과 (프로그램)바로가기를 만드는 과정이다. 여기서는 폴더를 생성하여 폴더 안에 바로가기를 하였다. '찾는 위치'를 [응용 프로그램 폴더] -> [DotNetCalc] -> [DotNetCalc.exe]로 선택하는 과정은 실제 실행파일인 exe파일이 들어있는 C드라이브 내 [응용 프로그램 폴더]에서 [DotNetCalc] ->[DotNetCalc.exe]로 링크를 (바로가기에) 걸어준 것이라 할 수 있다.)

--> [사용자 바탕 화면]의 [DotNetCalc]폴더 마우스로 선택한 후 오른쪽에 있는 창을 '우클릭'하여 [새 바로 가기 만들기] 클릭 --> 바로 위와 마찬가지로 [프로젝트에서 항목 선택] 창에서 '찾는 위치'를 [응용 프로그램 폴더] -> [DotNetCalc] -> [DotNetCalc.exe] 선택하고 '확인'버튼 클릭하면 "DotNetCalc.exe 바로 가기"로 초기이름이 설정될 때 "DotNetCalc"로 이름 변경                  --> 파일을 추가하기 위해서 [사용자 바탕 화면]의 [DotNetCalc]폴더 마우스로 선택한 후 오른쪽에 있는 창을 '우클릭'하여 [추가] -> [파일] 클릭 --> [파일 추가] 창에서 C:\...\DotNetCalc폴더에서 [bin] -> [Debug]폴더 내의 DotNetCalc.exe 파일을 선택하여 "열기"버튼 클릭하면 "DotNetCalc.exe"파일이 추가된다.(여기에서는 바탕화면에 생성될 "DotNetCalc"폴더 안에 "바로가기"와 "exe"파일을 만드는 과정을 한 것이다.)

--> [응용 프로그램 폴더], [사용자 프로그램 메뉴], [사용자 바탕 화면]에 각각 [DotNetCalc]폴더를 만들고 각각 바로가기 및 exe파일을 추가(만든)한 후 [솔루션 탐색기]의 [DotNetCalcSetup] 마우스 우클릭 -> [빌드] 클릭("빌드"까지 하면 "C:\...\DotNetCalc\DotNetCalcSetup"폴더의 "Debug"폴더 안에 "DotNetCalcSetup.msi"파일과 "setup.exe"파일이 생성된다.) (참고로 "DotNetCalcSetup.msi" 파일과 "setup.exe"파일은 같은 폴더에 있거나 또는 함께 있어야 한다. 윈도우즈 운영체제에서 *.msi파일은 setup.exe파일과 다른 위치에 있어도 단독으로 실행되어 설치를 진행하지만, 반대로 setup.exe파일은 msi파일과 따로 존재하는 경우 실행되지 않는다. 그런데 setup.exe파일이 *.msi파일과 같은 폴더에 있거나 함께 있는 경우에는 setup.exe파일을 실행해보면 정상적으로 실행되어 설치가 진행된다. 결론적으로 윈도우즈 운영체제에서 setup.exe파일은 *.msi파일이 실행되기위한 도우미 같은 역할을 한다고 생각할 수 있다.)

--> "빌드"를 통해 "C:\...\DotNetCalc\DotNetCalcSetup\Debug"폴더에 생성된 "DotNetCalcSetup.msi"파일 또는 "setup.exe"파일을 실행하면 '설치마법사' 창이 뜨면서 설치가 진행되며, 설치가 다 된 후에는 "바탕화면"에 "DotNetCalc"폴더와 그 안에는 "DotNetCalc.exe"와 "DotNetCalc 바로가기"가 설치되며, 윈도우즈의 [시작] -> [모든 프로그램]에 "DotNetCalc"폴더와 그 안에 "DotNetCalc 바로가기"가 만들어진다. 


/* 실습으로 설치된 "DotNetCalcSetup"파일은 [내 컴퓨터] ->[제어판] ->[프로그램 추가/제거]에 들어가서 찾아서 삭제할 것 */





< 실행결과 >

--> "빌드"한 후에 "C:\...\DotNetCalc\DotNetCalcSetup\Debug"폴더에 "DotNetCalcSetup.msi"파일과 "setup.exe"파일이 생성되었다.





--> 위에서 빌드후 생성된 "DotNetCalcSetup.msi"파일 또는 "setup.exe"파일 둘 중 하나를 실행하여 '설치마법사'창에서 설치를 완료하면, "바탕화면"에 "DotNetCalc"폴더가 만들어지고, 이 폴더안에 "DotNetCalc 바로가기"와 "DotNetCalc.exe"파일이 만들어진다.




--> '윈도우즈'의 "시작"에 "모든 프로그램"을 보면 "DotNetCalc"폴더와 그 폴더 안에 "DotNetCalc 바로가기"가 설치된 것을 볼 수 있다.




--> "바탕화면"에 설치된 "DotNetCalc"폴더 내의 "DotNetCalc 바로가기" 또는 "DotNetCalc.exe"파일을 실행하거나 / "시작 - 모든 프로그램"에 설치된 "DotNetCalc"폴더 안의 "DotNetCalc 바로가기"를 실행하면 아래와 같이 계산기 프로그램이 실행된다.




Posted by holland14
:


==> Program.cs


using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace DotNetCalc
{
    static class Program
    {
        /// <summary>
        /// 해당 응용 프로그램의 주 진입점입니다.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MainForm());
        }
    }
}



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




==> MainForm.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 DotNetCalc
{
    public partial class MainForm : Form
    {
        private string buffer; // 입력된 문자열들을 묶어줄 그릇

        public MainForm()
        {
            InitializeComponent();
        }
               
        private void btnCommand_Click(object sender, EventArgs e)
        {
            Button btn = sender as Button;

    #region 각각의 버튼 클릭시 해당 문자열을 buffer에 담기

  if (btn == btnOne)
         {
          buffer += "1";
         }
            else if (btn == btnTwo)
         {
                buffer += "2";
         }
            else if (btn == btnThree)
         {
                buffer += "3";
         }
            else if (btn == btnFour)
         {
                buffer += "4";
         }
            else if (btn == btnFive)
         {
                buffer += "5";
         }
            else if (btn == btnSix)
         {
                buffer += "6";
         }
            else if (btn == btnSeven)
         {
                buffer += "7";
         }
            else if (btn == btnEight)
         {
                buffer += "8";
         }
            else if (btn == btnNine)
         {
                buffer += "9";
         }
                else if (btn == btnZero)
         {
                buffer += "0";
         }
            else if (btn == btnLeft)
         {
                buffer += "(";
         }
            else if (btn == btnRight)
         {
                buffer += ")";
         }
            else if (btn == btnPlus)
         {
                buffer += " + ";
         }
            else if (btn == btnMinus)
         {
                buffer += " - ";
         }
            else if (btn == btnMultiply)
         {
                buffer += " * ";
         }
            else if (btn == btnDivide)
         {
                buffer += " / ";
         }
            else if (btn == btnPoint)
         {
                buffer += ".";
         }

 #endregion

            txtExpression.Text = buffer;
        }

        private void btnClear_Click(object sender, EventArgs e)
        {
            buffer = String.Empty;
            txtExpression.Text = "";
        }

        private void btnBackspace_Click(object sender, EventArgs e)
        {
            if (buffer.Length > 0)
            {
                // 마지막 한자리 삭제
                buffer = buffer.Substring(0, buffer.Length - 1);
                txtExpression.Text = buffer;
            }
        }

        // 문자열로 지정된 수식을 실제 수식으로 변환 후 결과값 계산
        private void btnEnter_Click(object sender, EventArgs e)
        {
            // 문자열 수식에서 공백 제거
            string temp = txtExpression.Text.Replace(" ", "");
            if (String.IsNullOrEmpty(temp))
            {
                MessageBox.Show("수식을 입력하시오.");
                return;
            }
            this.txtExpression.Text += " = \r\n\r\n" + MakeExpression(ref temp).ToString();
            buffer = ""; // 버퍼 초기화(= 최상위 buffer는 널값으로 초기화)
        }


       
        // MakeExpression : 결과값 텍스트박스에 출력, 공백이 제거되어 넘겨져온 수식을 계산한다.
        /// <summary>
        /// [4] 문자열로 지정된 계산식을 실제 계산식으로 변경
        /// </summary>
        /// <param name="str">3 * (2 + 3)</param>
        /// <returns>15</returns>
        public double MakeExpression(ref string str)
        {
            int index = 0; // 문자 위치
            // 구문 결과값 가져오기
            double value = Sentence(ref str, ref index);
            while (index < str.Length)
            {
                switch (str[index])
                {
                    case '+':
                        ++(index);
                        value += Sentence(ref str, ref index);
                        break;
                    case '-':
                        ++(index);
                        value -= Sentence(ref str, ref index);
                        break;
                    default: // 엉뚱한 값이 들어오는 경우
                        MessageBox.Show("잘못된 구문입니다.");
                        break;
                }
            }
            return value;
        }


        /// <summary>
        /// [3] 하나의 완성된 수식을 계산하는 메서드
        ///     (3 * 5) = 15
        /// </summary>
        /// <param name="str">(3 * 5)</param>
        /// <param name="index">0</param>
        /// <returns>15</returns>
        public double Sentence(ref string str, ref int index)
        {
            double value = GetNumber(ref str, ref index); // 첫번째 숫자
            while (index < str.Length)
            {
                if (str[index] == '*')
                {
                    ++(index);
                    value *= GetNumber(ref str, ref index);
                }
                else if (str[index] == '/')
                {
                    ++(index);
                    value /= GetNumber(ref str, ref index);
                }
                else
                    break;
            }
            return value;
        }
       
       
        /// <summary>
        /// [2] 문자열에서 첫번째 나오는 숫자형을 실제 숫자형으로 변환시켜주는 함수
        /// </summary>
        /// <param name="str">(12.34+3)</param>
        /// <param name="index">1</param>
        /// <returns>12.34(숫자형)</returns>       
        public double GetNumber(ref string str, ref int index)
        {
            double value = 0.0;

            // GetSubstring함수 호출해서 괄호안에 있는 문자열만 가져오기
            if (str[index] == '(')
         {
                ++(index);
                string substr = GetSubstring(ref str, ref index);
                return MakeExpression(ref substr); // 괄호안의 수식만 먼저 계산
         }
            while ((index < str.Length) && Char.IsDigit(str, index))
            {
                value = 10.0 * value + Char.GetNumericValue(str[(index)]);
                ++(index);
            }
            if ((index == str.Length) || str[index] != '.') return value;
         double factor = 1.0;
            ++(index);

            while ((index < str.Length) && Char.IsDigit(str, index))
            {
                factor *= 0.1;
                value = value + Char.GetNumericValue(str[index]) * factor;
                ++(index);
            }

            return value;
        }
        

        //[1] 괄호안에 있는 하위 문자열을 추출(하는 함수 만들기) : (123+5) => 123+5만 추출
        public string GetSubstring(ref string str, ref int index) // GetSubstring : 괄호안의 문자열을 추출하는 함수
        {
            string substr = ""; // 하위 문자열 저장
            int numL = 0; // 왼쪽 괄호의 개수
            int bufindex = index; // 인덱스의 시작 값
            while (index < str.Length)
            {
                switch (str[index])
             {
                    case ')' :
                        if (numL == 0)
                     {
                            char[] substrChars = new char[index - bufindex];
                            str.CopyTo(bufindex, substrChars, 0, substrChars.Length);
                            substr = new String(substrChars);
                            ++(index);
                            return substr;
                     }
                        else
                            numL--; // 왼쪽 괄호와 일치하는 오른쪽 괄호가 나타날 시 감소
                        break;

                    case '(' :
                        numL++;
                        break;
                }
                ++(index);
            }
            MessageBox.Show("잘못된 구문입니다.");
            return substr;
     }
    }
}

 




< 실행결과 >








Posted by holland14
:


* 입력/출력/수정/삭제/검색/저장/종료/백업 기능을 WinForm에서 만듦.



==> Program.cs



using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace 주소록
{
    static class Program
    {
        /// <summary>
        /// 해당 응용 프로그램의 주 진입점입니다.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MainForm());
        }
    }
}




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



==> Address.cs



using System;

namespace 주소록
{
    class Address
    {
        public int Num { get; set; }
        public string Name { get; set; }
        public string Mobile { get; set; }
        public string Email { get; set; }
    }
}




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



==> MainForm.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;
using System.IO;

namespace 주소록
{
    public partial class MainForm : Form
    {
        private List<Address> addr;
        private string dir = System.IO.Path.Combine(    // Path.Combine : 경로 묶어준다.
                Application.StartupPath, "MyAddress.txt"); // Application.StartupPath : exe파일과 같은 경로로 지정해준다.

        public MainForm()
        {
            InitializeComponent();
            addr = new List<Address>();
        }

        private void MainForm_Load(object sender, EventArgs e)
        {
            if (File.Exists(dir))
            {
                LoadData();
            }
            this.sslCount.Text = "등록수 : " + addr.Count.ToString();
            if (addr.Count > 0)
            {
                ShowRecord(0); // 첫번째 데이터를 표시
                btnAdd.Text = "추가";
            }
        }

        private void LoadData()
        {
            StreamReader sr = new StreamReader(dir, Encoding.Default); // StreamReader의 생성자를 통해 파일을 연다.(-> open)

            while (sr.Peek() >= 0) // -1 : 더 이상 읽을 문자가 없을 때
            {
                string[] arr = sr.ReadLine().Trim().Split(',');

                if (arr[0] != "" && arr[0] != null)
                {
                    Address a = new Address();
                    a.Num = Convert.ToInt32(arr[0]); // 번호 : 인덱스 + 1
                    a.Name = arr[1];
                    a.Mobile = arr[2];
                    a.Email = arr[3];

                    addr.Add(a); 
                }
            }
            sr.Close(); // StreamReader를 통해 파일을 열었으면 꼭 닫아줘야 한다!
            sr.Dispose(); // 해제
            DisplayData();           
        }

        private void btnAdd_Click(object sender, EventArgs e)
        {
            if (btnAdd.Text == "입력")
            {
                Address a = new Address();
                a.Num = addr.Count + 1; //
                a.Name = txtName.Text.Trim();
                a.Mobile = txtMobile.Text.Trim();
                a.Email = txtEmail.Text.Trim();

                addr.Add(a);
                DisplayData(); // 출력
            }
            else
            {               
                btnAdd.Text = "입력";
            }
            ClearTextBox();
        }

        // Clear관련
        private void ClearTextBox()
        {
            txtName.Text = txtMobile.Text = txtEmail.Text = String.Empty;
        }

        // 출력관련
        private void DisplayData()
        {
            var q = (from a in addr select a).ToList();
            this.dgvAddress.DataSource = q;
        }

        // 검색전용
        private void DisplayData(string query)
        {
            var q = (from a in addr
                     where
                         a.Name == query ||
                         a.Mobile == query ||
                         a.Email == query
                     select a).ToList();
            this.dgvAddress.DataSource = q;
        }

        // 저장관련 -> 텍스트파일에 저장함.
        private void btnSave_Click(object sender, EventArgs e)
        {
            if (addr.Count > 0)
            {
                SaveData();
            }
        }

        private void SaveData()
        {     

            //if (!File.Exists(dir)) // 파일이 없으면 생성
            //{
            //    File.Create(dir); // 해당경로에 파일이 없으면 생성
            //}

            // 레코드는 엔터구분, 필드는 콤마구분으로 저장
            StringBuilder sb = new StringBuilder();
            int index = 0;
            foreach (Address a in addr)
            {
                sb.AppendLine(String.Format("{0},{1},{2},{3}"
                , ++index, a.Name, a.Mobile, a.Email)); // 번호 : 인덱스 + 1
            }
            StreamWriter sw = new StreamWriter(dir, false, Encoding.Default); // "StreamWriter"는 파일이 없으면 만들어서 저장한다.
            sw.Write(sb.ToString());
            sw.Close(); // 닫기
            sw.Dispose(); // 해제
            MessageBox.Show("저장되었습니다.");
        }

        // 백업 관련
        private void miBackup_Click(object sender, EventArgs e)
        {
            string name = Path.GetFileNameWithoutExtension(dir);
            string ext = Path.GetExtension(dir).Replace(".", "");

            // MyAddress20100101.txt로 저장가능하도록
            string newDir =
                Path.Combine(Application.StartupPath,
                   String.Format("{0}{1}.{2}"
                       , name
                       , String.Format("{0}{1:0#}{2}"
                           , DateTime.Now.Year
                           , DateTime.Now.Month
                           , DateTime.Now.Day.ToString().PadLeft(2, '0')
                         )
                       , ext
                   )
               );

            if (File.Exists(dir))
            {
                File.Copy(dir, newDir, true); // 원본을 복사해서 백업해놓는다.
            }
        }

        private void miExit_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private int currentIndex = -1;
        private void dgvAddress_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            //currentIndex = e.RowIndex; // 현재 인덱스를 필드에 보관
            DataGridViewCell dgvc = dgvAddress.Rows[e.RowIndex].Cells[0];
            currentIndex = Convert.ToInt32(dgvc.Value.ToString()) - 1;
            if (currentIndex != -1)
            {
                ShowRecord(currentIndex);
            }
        }

        private void ShowRecord(int index)
        {
            // 현재 선택된 인덱스 + 1을 번호 출력
            this.txtNum.Text = (index + 1).ToString();
            this.txtName.Text = addr[index].Name;
            this.txtMobile.Text = addr[index].Mobile;
            this.txtEmail.Text = addr[index].Email;

            btnAdd.Text = "추가";
            txtGo.Text = txtNum.Text; // 현재 선택된 인덱스 값 출력
        }

        private void btnModify_Click(object sender, EventArgs e)
        {
            if (currentIndex != -1 && blnModified == true) // currentIndex != -1 : 선택된 데이터가 있다면
            {
                // 변경된 데이터로 addr 개체의 현재 인덱스 데이터 변경
                addr[currentIndex].Name = txtName.Text;
                addr[currentIndex].Mobile = txtMobile.Text;
                addr[currentIndex].Email = txtEmail.Text;

                MessageBox.Show("수정되었습니다.", "수정완료");

                DisplayData();
                blnModified = false; // 다시 초기화
            }           
        }

        // 3개 텍스트박스에서 KeyPress 이벤트 발생시 호출
        private bool blnModified = false;
        private void txtModify_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (txtNum.Text != "") // 데이터가 로드된 상태에서만
            {
                blnModified = true; // 변경되었다...
            }
        }

        private void btnDelete_Click(object sender, EventArgs e)
        {
            if (txtNum.Text != "" && currentIndex != -1) // txtNum.Text != "" : 널값이 아니라면... / currentIndex != -1 : 선택된 상태가 아니라면...
            {
                DialogResult dr =
                        MessageBox.Show("정말로 삭제하시겠습니까?", "삭제확인"
                            , MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                               
                if (dr != DialogResult.No)
                {
                    // 메모리 상에서 현재 레코드 삭제
                    addr.RemoveAt(currentIndex);
                    DisplayData();
                }
            }
        }

        // 처음, 이전, 다음, 마지막 버튼에 대한 공통 이벤트
        private void btnMove_Click(object sender, EventArgs e)
        {
            Button btn = sender as Button;

            if (btn == btnFirst)
            {
                if (currentIndex > 0)
                {
                    currentIndex = 0; // 0번째 인덱스로 표시                   
                }
            }
            else if (btn == btnPrev)
            {
                if (currentIndex > 0)
                {
                    currentIndex--;
                }
            }
            else if (btn == btnNext)
            {
                if (currentIndex < addr.Count - 1)
                {
                    currentIndex++;
                }
            }
            else if (btn == btnLast)
            {
                if (currentIndex != -1) // 데이터가 있다면
                {
                    currentIndex = addr.Count - 1;
                }
            }

            ShowRecord(currentIndex); // 다시 데이터 표시
        }

        private void btnGo_Click(object sender, EventArgs e)
        {
            if (txtGo.Text != "" && Convert.ToInt32(txtGo.Text) > 0
                    && Convert.ToInt32(txtGo.Text) <= addr.Count)
            {
                ShowRecord(Convert.ToInt32(txtGo.Text) - 1);
            }
        }

        private void btnSearch_Click(object sender, EventArgs e)
        {
            DisplayData(txtSearch.Text);
        }
    }
}





< 실행결과 >



--> 4명의 데이터가 존재하는 상황에서 '폼'을 새로 load했을 때 초기화면(데이터가 존재하고 있을 때는 '폼' load시에 초기화면이 "입력"버튼이 "추가"버튼으로 바뀌어져 나온다.) '폼'의 '이름', '휴대폰', '이메일' TextBox에 데이터를 입력한 후 "추가"버튼을 누르면 '폼'아래의 'DataGridView'에 데이터가 출력되고 "저장"버튼을 누르면 "저장되었습니다."라고 'MessageBox'가 나오며, 데이터가 "텍스트파일(메모장)"로 저장된다.  





--> '폼'의 '이름', '휴대폰', '이메일' TextBox에 데이터를 입력한 후 '저장'하였을 때 해당폴더(.exe파일이 있는 'Debug'폴더)에 "텍스트파일(메모장)"형태로 데이터가 저장된다.





--> "추가"버튼을 누르면 "추가"버튼의 텍스트가 "입력"으로 바뀌면서 동시에 '이름'/'휴대폰'/'이메일'의 TextBox가 Clear되어진다.('번호'의 TextBox'속성'은 "Readonly"로 설정해서 값을 변경할 수 없다.)








Posted by holland14
: