VB의 Left구현하기... 확장메서드를 이용함...
간단해서.. 그닥.. 기록할내용은 없는듯...
사용법 :
this.Text = "ABCCC".Left(2);
확장메서드 구현 :
/// <summary>
/// VB.Left() 함수를 구현한 확장메서드임.
/// </summary>
internal static class exString
{
/// <summary>
/// VB.Left() 함수를 구현한 확장메서드임.
/// </summary>
/// <param name="targetstr"></param>
/// <param name="length">왼쪽에서~~ </param>
/// <returns></returns>
internal static string Left(this string targetstr, int length)
{
if (length < 0) // -1이 들어왔을때...
throw new Exception("'Length' 인수는 0보다 크거나 같아야 합니다.");
if (targetstr.Length > length )
{
return targetstr.Substring(0, length);
}
else
{
return targetstr;
}
}
/// <summary>
/// VB.Right() 함수를 구현한 확장메서드
/// </summary>
/// <param name="targetstr"></param>
/// <param name="length"></param>
/// <returns></returns>
internal static string Right(this string targetstr, int length)
{
if (length < 0)
{
throw new Exception("'Length' 인수는 0보다 크거나 같아야 합니다.");
}
if (targetstr.Length > length)
{
return targetstr.Substring(targetstr.Length - length, length);
}
else
{
return targetstr;
}
}
}
2010, 2, 25 일 Right 추가..
'# 3) .Net ( Vs 2008 ) > C#' 카테고리의 다른 글
암묵적인 형변환? 코드...? (0) | 2010.05.18 |
---|---|
IPC .Net ( 프로세스간 통신 ) (1) | 2010.05.12 |
기간 출력하고자 할때... (0) | 2010.02.18 |
NotifyIcon에 ContextMenuStrip 2개 동적으로 바꾸기... (0) | 2010.02.12 |
ComboBox Item Binding (0) | 2010.01.26 |
기간 출력하고자 할때...
VB에 Format(일수, "mm" ) 이란 함수를 호출하면 일자에 맞는 기간을 출력해준다고 한다
예)
399 를 넣으면 "1년 1개월 3일" 이 나온다고 한다.
머리를 조낸 굴려봐도 지원되는 객체는 안보인다..
기간에 해당하는것 하면 TimeSpan이 바로 떠오르는데...
TimeSpan에서 출력해주는 건 전혀 없다.
아래와 같이 직접 구해야 하는듯 하다.
TimeSpan.Zero ~ TimeSpan.FormDays( 일수 ) 만큼에 Tick값으로
DateTime을 생성하면 DateTime의 초기값 1년 1월 1일 ~ 계산되어 만들어진다.
DateTimeOffset객체에서 ToOffSet( TimeSpan ); 메서드를 이용해볼까 했었는데...
이거자체가 DateTime때문에 에러가 뜨게 되므로...
직접 포멧을 지정해야한다.
double day = 399;
DateTimeOffset off = new DateTime(TimeSpan.FromDays( day ).Ticks );
MessageBox.Show(string.Format("{0}년 {1}개월 {2}일", off.Year - 1, off.Month - 1, off.Day - 1));
DateTimeOffset 은 그냥 ... 알게된 객체이므로... 써본다.
http://msdn.microsoft.com/ko-kr/library/system.datetimeoffset_members.aspx
추가적으로 WPF 게시판에 올라왔던 답변을 좀 허접하게 달았던 내용을
다음과 같이 처리한다.
질문내용은 두날짜간에 개월수 차이를 구하여 컬럼으로 표시하고자 하는 부분이었으나
처음 단 답글은 년차를 월에 포함하지 못하는 상황과 약간에 판단착오가 있었다.
이에 대해.. 위 기간 구하는것을 참고하여 아래와 같이 바꾸고 그 답변에 대해 알림형태로 게시판에 남겼다.
DateTime dt = new DateTime(2001, 2, 1);
DateTime dt2 = new DateTime( Math.Abs( ( new DateTime(2002, 2, 27).Subtract( dt ).Ticks ) ) );
MessageBox.Show(( ((dt2.Year-1) * 12) + ( dt2.Month ) ).ToString());
'# 3) .Net ( Vs 2008 ) > C#' 카테고리의 다른 글
암묵적인 형변환? 코드...? (0) | 2010.05.18 |
---|---|
IPC .Net ( 프로세스간 통신 ) (1) | 2010.05.12 |
VB의 Left구현하기... 확장메서드를 이용함... (0) | 2010.02.22 |
NotifyIcon에 ContextMenuStrip 2개 동적으로 바꾸기... (0) | 2010.02.12 |
ComboBox Item Binding (0) | 2010.01.26 |
패턴을 써서 좋은점...
패턴을 쓰면 좋은점에 대해 안쓴듯 하여 조금더 써보도록 한다.
결론부터 말하자면 유지보수 관점으로 객체를 설계해야 할경우 패턴을 이용하면 유지보수 관련 포인트를 다수 축소시킬수 있게 된다.
아래 간단한 예를 들어본다.
프로그래밍 작업은 곧 데이타 객체들을 조립하여 하나의 프로그램을 만들어내는 것이다. 조립된 형태에 따라 유지보수를 어떻게 할수 있는지가 판가름 나는 것 같다.
보통 객체를 생성할때는 특정 객체(Form or UserControl or Class)에서 new 예약어를 통해서 객체를 생성하는데
class {
ClassType cObject = new ClassType();
}
형태로 객체를 생성하게 되었을시 해당 객체를 특정사유에 의해 변경하고자 하는 경우 위 소스에서는 선언한 타입과 생성타입 모두 찾아 바꾸어야 한다.
물론 Visual Studio를 이용하면 바꾸는 것도 나름 쉽게 바꿀수 있겠으나 이를 바꾸면서 발생할수 있는 오류에 대한 접근 포인트가 많아 질것이다. 또한 해당 객체를 사용하는데 있어서 메서드등이 특정객체에 종속되는 경향이 있으므로 이 또한 객체와 객체간에 결속력이 강해져서 떼어낼 수 없게 된다. 지금까지 작업들을 보면 떼어낼 일이 거의 없었다. 앞으로도???
위와 같은 문제애 대한 해결책으로 Interface나 추상객체를 만들어 상속을 통해 객체를 정의 하고 생성하는 경우 선언한 타입이 공통분모가 되면서 바뀌므로 생성타입에 대한 유지보수 관련 포인트가 남게 된다.
생성타입 객체가 자주 쓰여지는 객체일시 여전히 많은 부분이 손길을 기다리게 되므로 이를 더욱더 축소하기 위한 방법으로
생성패턴을 고려해볼수 있다.
Factory 패턴으로 하자면
공통타입 = Factory.Create("타입1"); 으로 생성된 객체를 받게 될시엔 사용하는곳 에서의 손볼곳은 거의 없다.
생성하는 위치 곧 Create( string TypeName) 이란 메서드 내부 구현에서 생성되는 객체에 대한 부분만이 유지보수꺼리로 남아 있게 된다.
단, 주의 할점은 공통타입이 제공하는 메서드 또는 프로퍼티가 생성되는 객체에 모두 적용되어 있어야 하고 또 사용하는 부분이 객체마다 다를수 있기때문에 이에 대한 정의가 충분히 고려되어야 한다. 이는 추상화 또는 가상메서드를 이용하고 이를 오버라이드 하는 방법으로 해결할수 있다. 여기서 객체의 크기에 대해서는 고려하지 않겠다.
또는 Singleton 패턴으로
특정객체 = Singleton.GetInstance(); 해서 사용하는 경우도 있는데 싱글톤인 경우는 객체 자체를 유일한놈으로 보고 만들기때문에 이 객체에 대한 접근할수 있는 부분을 최소화 하는 방법이 주요하다.
DB와 직접 연결되는 통로를 담당하는 객체에 사용해보거나 DebugView용 Form에 적용도 해보았다.
또 Builder 라는 패턴으로
객체를 생성하는데 있어서 객체들을 조립하는 형태로 만들어내는 패턴이다.
또 자기 상태를 View객체에 직접 알림으로써 변경사항등에 대한 다른 처리등을 유도할수 있는 옵져버,
계층구조를 가지는 데이타를 처리할수 있는 콤보짓트, 비지터, 체인등등...
어차피 유지보수를 할꺼면 초기 개발에서 좀더 고민하고 고려해서 유지보수 포인트를 줄이는데 힘쓰는게 비용측면에서나 정신적으로나 좋다고 볼수 있다.
디자인 패턴이란 프로세스를 만들어내기 위해 필요한 객체들을 어떻게 배치하고 조립하느냐에 따른 기술에 대한 명칭일뿐이다. 패턴을 몰라도 이미 사용중에 있을것이며 주로 사용하는 패턴에 대해서 옛날 개발자들이 이름을 붙여놓은 것이다.
남용하지 말고 적제적소에 쓰면 좋을것이고 또한 사용된 패턴들에 대해 알아야 다른 개발자가 구현한 소스들을 볼수 있게되니 꼭 공부해두는게 좋을듯 하다.
'# 5) 디자인패턴(for .NET )' 카테고리의 다른 글
객체를 공부하면서... 커플링? 느슨한결합도? (0) | 2010.05.04 |
---|---|
체인 패턴... (0) | 2010.05.04 |
커맨드패턴 (0) | 2010.05.03 |
디자인 패턴 설명이 정말 쉬운곳... (0) | 2010.03.16 |
디자인 패턴에 관하여... (0) | 2010.02.17 |
디자인 패턴에 관하여...
닷넷을 시작하고 oop에 관심을 가지기 시작하던때 어느날 갑자기 나타난 "디자인패턴"이 날 더욱 더 혼란스럽게 만들었다.
여전히 UML을 기초로 하여 그려진 패턴에 대한 UML은 이해가 안된는 실정이다.
나만에 객체 표현법들을 기초로 하여 이런저런 방법들과 패턴을 익혀나가며 여러가지 패턴에 관련된 문서를 찾아다니며 보아왔
으며 개발프레임웍을 만들면서 더욱 더 프레임웍을 탄탄하게 만들어준 패턴이 고마울 따름이다.
이에 누구나 패턴에 대해 쓰고 있으나 실제 응용면에서나 실제로 사용되는 예를 들어 설명하는 패턴에 대한 문서는 찾기 힘들어보인다. 그래서 간략히나마 정리하고 .NET FrameWork에 어떻게 쓰여지고 있는지 찾아보며 기록하고자 카테고리를 만든다.
이 카테고리의 글들은 모두 비공개 형식으로 작성을 하게 될것임.
'# 5) 디자인패턴(for .NET )' 카테고리의 다른 글
객체를 공부하면서... 커플링? 느슨한결합도? (0) | 2010.05.04 |
---|---|
체인 패턴... (0) | 2010.05.04 |
커맨드패턴 (0) | 2010.05.03 |
디자인 패턴 설명이 정말 쉬운곳... (0) | 2010.03.16 |
패턴을 써서 좋은점... (0) | 2010.02.17 |
NotifyIcon에 ContextMenuStrip 2개 동적으로 바꾸기...
훈스닷넷에서 NotifyIcon 활성화 하고.
마우스 왼쪽, 오른쪽 버튼을 각각 다른 메뉴를 주고 싶다고 하신분께 올린 답글임.
몇가지 방법을 찾아봤는데 애매 했었으나...
ContextMenuStrip.Show 에서 해결책이 하나 있고.
여기에 부합되게 MousePosition 이란 값을 이용할수 있었다.
NotifyIcon 의 mouseEvt 에 이벤트 매개변수를 이용해봤지만 원하는곳에 Show가 안된다!
그래서 MousePosition 을 이용해서 마우스 위치값을 사용함. 아주 잘된다!
초보시라니 초간단.... 방법을 소개 해드리죵...
구성은 Form 1개
NotifyIcon 1개
ContextMenuStrip 2개 (Left용, Right용 )
주의 NotifyIcon에 ContextMenuStrip 속성에는 바인딩 하지 않습니다.
아래소스 대로 돌려보세용... 원하시는데로~~ 될꺼임돵.
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.Load += new EventHandler(Form1_Load);
this.Shown += new EventHandler(Form1_Shown);
}
void Form1_Shown(object sender, EventArgs e)
{
this.Hide();
}
void Form1_Load(object sender, EventArgs e)
{
//this.notifyIcon1.ContextMenuStrip = contextMenuStrip1; 바인딩하지 않는다!
this.notifyIcon1.MouseDown += new MouseEventHandler(contextMenuStrip1_MouseDown);
}
void contextMenuStrip1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
contextMenuStrip1.Show( MousePosition );
}
else if( e.Button == MouseButtons.Right)
{
contextMenuStrip2.Show(MousePosition);
}
}
private void leftMouseDownToolStripMenuItem_Click(object sender, EventArgs e)
{
MessageBox.Show("Left Click");
}
private void rightMouseToolStripMenuItem_Click(object sender, EventArgs e)
{
MessageBox.Show("RightClick");
}
}
'# 3) .Net ( Vs 2008 ) > C#' 카테고리의 다른 글
암묵적인 형변환? 코드...? (0) | 2010.05.18 |
---|---|
IPC .Net ( 프로세스간 통신 ) (1) | 2010.05.12 |
VB의 Left구현하기... 확장메서드를 이용함... (0) | 2010.02.22 |
기간 출력하고자 할때... (0) | 2010.02.18 |
ComboBox Item Binding (0) | 2010.01.26 |
FlexGrid의 Header Merge 구현하다가 생긴일...
현재 작업중인 폼에서 헤더 머지 기능 빼고 모두 완료하여
머지기능을 추가하고 나서 띠우니 객체를 사용하려거든 new 로 생성후 써라 라는 멘트와 접했다.
"어! 분명이 좀전에 떴는데... "
라며 추가한 머지기능에 대해 고민하던 중... 소스와 열심히 비교하고 확인하여도 문제가 없어보였다.
주변에 계신분께도 여쭤보고 봤지만... 분명... 문제 없었는데 머지구현중 뭔가 만진게 아닌가 라며
얘기를 하신다.
점심을 먹으며 골똘히 생각해봤지만 분명 머지 구현전에는 창이 잘 떴었고 현재 에러도
로드가 완료된 후 Paint되는 시점에서 발생하는듯 한데...
그렇다면 데이타를 바인딩 한것도 아닌 컨트롤에서 발생할수 있는 오류는 머지뿐인듯 한데...손댄곳도 그렇고...
오류가 생기던 상황이다.
grdData.Rows.Fixed = 2;
grdData.Rows.Count = 2;
grdData.Cols.Count = 18;
해결 방법에 관련된 소스다.
grdData.Rows.Count = 2;
grdData.Cols.Count = 18;
grdData.Rows.Fixed = 2;
VB.NET을 바꾸면서...
소스를 보고 그대로 바꾸었는데
.Rows.Fixed = 2
.Cols.Fixed = 1
.Rows.Count = 2
.Cols.Count = 18
원본이다 ㅡ.,ㅡ; 줴길..
추가: grdData.Rows.Count = 2;
grdData.Cols.Count = 18;
grdData.Rows.Fixed = 1; <-- 1 값을 가져도 에러 발생
고쳐졌다 생각하고 테스트 했던 소스 걷어내고 수정하던중... 어이 없게 Rows.Fixed 를 1을 주면서 에러가 똑같이 떴다.
'--- 취미 > 생각하기' 카테고리의 다른 글
[멋진글... (펌)]현재 하고 있는 세븐소울즈가 캐쉬템을 팔면서 올라온글... (0) | 2010.04.30 |
---|---|
세상은 사소한것들을 무시하는듯 하다... (0) | 2010.03.12 |
노트북을 사다... (0) | 2010.01.16 |
오늘은 왠일로... 30명이나... (0) | 2010.01.13 |
2009년을 마치며... (0) | 2009.12.31 |
Enum객체 관련 설명.
훈스닷넷에 있는 질문글에 대한 답글로 밥먹기 전에 적어보았다...
열거형의 인덱스로 접근할수 있는 방법 vs2005에서는
Enum.GetValues(typeof(DayOfWeek))[1] <--이렇게 바로 []인덱스를 붙였던것 같은데...
2008에선 안되넹.. 반환타입이 Array라고 해서.. .GetValue 메서드를 이용해서 추출한다.
object dayofWeek = Enum.GetValues(typeof(DayOfWeek)).GetValue(0);
MessageBox.Show( dayofWeek.ToString() );
아래는 해당 요일을 시작요일로 바꾸고자 할때.
this.Text = ((((int)DayOfWeek.Sunday) + (int)DayOfWeek.Tuesday) % 7) .ToString();
this.Text += ((((int)DayOfWeek.Monday) + (int)DayOfWeek.Tuesday) % 7).ToString();
this.Text += ((((int)DayOfWeek.Tuesday) + (int)DayOfWeek.Tuesday) % 7).ToString();
this.Text += ((((int)DayOfWeek.Wednesday) + (int)DayOfWeek.Tuesday) % 7).ToString();
this.Text += ((((int)DayOfWeek.Thursday) + (int)DayOfWeek.Tuesday) % 7).ToString();
this.Text += ((((int)DayOfWeek.Friday) + (int)DayOfWeek.Tuesday) % 7).ToString();
this.Text += ((((int)DayOfWeek.Saturday) + (int)DayOfWeek.Tuesday) % 7).ToString();
DayOfWeek.Tuesday 기준일로 부터 들어오는 각 요일에 대해 인덱스값을 뽑아낼수 있게됨.
뭐 어렵지 않으니...그닥 설명할것도 없눼...........
'# 1) 프로그래밍' 카테고리의 다른 글
개발을 하다보니... (0) | 2010.03.29 |
---|---|
배열 정렬하기...? (0) | 2010.02.25 |
삼항연산자 중복... (0) | 2010.02.05 |
머리에 물주전자 올려 뎁혀서 커피 한잔? (0) | 2010.01.25 |
VS : 정의 보기 -> 되돌아가기.. 단축키 (1) | 2010.01.22 |
삼항연산자 중복...
예전에 본것같은데 기억이 안나서
직접 해놓고 해당 값이 어떻게 출력되는지 뽑아 보았다.
왜썼는지는 일끝나고... 추가..
public Form1()
{
InitializeComponent();
//null;
string Target = "ㅁㅁㅁ";
this.Text = Target == null ? 1 > 0 ? "_1" : "_2" : "_3" ;
/*
* 조건 1 조건 2 결과
* 참 참 _1
* 참 거짓 _2
* 거짓 거짓 _3
* 거짓 참 _3
*/
// this.Text = Target ?? (Target != null ? "!" : "_"); // 결과는 _ null이니까.
}
추가 내용 :
소스 상에서 특정 변수값이 null인지를 따져야 하고 다음으로 이값이 어떤 특정값인지체크 하기 위해 작성을 하다보면
간혹 이런 코드라인이 한두줄 걸쳐서 나올때 if문 갯수가 눈을 어지럽히게 된다.
if( 객체 != null && 객체 == 특정값)
{
처리1;
}
else
{
처리 2;
}
.. 한두줄 다른거 체크
if( ... 위에 로직 반복... )
.. 한두줄 다른거 체크..
이러다보면 몇라인 보지도 못하고 화면을 계속 스크롤 해야 하는 경우가 생기는데..
삼항 연산자를 중복으로 사용하여 같은 처리 로직을 만든다 .
물론 조건1? 조건2 ? 조건1 && 조건2 가 참 : 조건1 참 , 조건2 거짓 : 조건1이 거짓 ; 이
로직을 모를경우 문제가 되겠지만... 이런건 간단한 주석으로 알려줄수 있는 문제이다.
위를 간단히 해석하고 싶으면 () 를 이용하면 된다 .
조건1? ( 조건2 ? 조건1 && 조건2 가 참 : 조건1 참 , 조건2 거짓 ) : 조건1이 거짓 ;
조건 1 에 걸렸을때
참 ->( 다음 조건식 => 참 -> 첫번째 반환값이 ,
거짓 -> 다음식에 거짓값인 가운데 값이 반환 )
거짓 -> 끝에 거짓 값이 반환
null ? 1 > 0 ? "_1" : "_2" : "_3" ;
'# 1) 프로그래밍' 카테고리의 다른 글
배열 정렬하기...? (0) | 2010.02.25 |
---|---|
Enum객체 관련 설명. (0) | 2010.02.10 |
머리에 물주전자 올려 뎁혀서 커피 한잔? (0) | 2010.01.25 |
VS : 정의 보기 -> 되돌아가기.. 단축키 (1) | 2010.01.22 |
나만에 개발방법... (0) | 2010.01.13 |
데이타 그리드 뷰에 콤보 컬럼에 대한 값 읽기...
훈스 게시판에 올라온 질문에 대한 답변으로...
그리드 뷰의 콤보컬럼을 추가하고 값을 읽는 방법에 대해 살짝쿵!!
음 그리드뷰 관련해서 카테고리를 따로 만들어놓고 쓸까낭... 지금까지 만든 아답타 클래스도 공개를 ...? 험...
DataGridView dgv = new DataGridView();
DataGridViewComboBoxColumn dgvCombo = new DataGridViewComboBoxColumn();
dgvCombo.Items.Add("a");
dgvCombo.Items.Add("b");
dgvCombo.Items.Add("c");
dgvCombo.HeaderText = "콤보컬럼";
dgv.Columns.Add(dgvCombo);
this.Controls.Add(dgv);
dgv.Rows.Add(1);
((DataGridViewComboBoxCell)dgv.Rows[0].Cells[0]).Value = "b";
MessageBox.Show(((DataGridViewComboBoxCell)dgv.Rows[0].Cells[0]).Value.ToString());
'# 2) .Net ( Vs 2005 ) > WinForm' 카테고리의 다른 글
리스트 박스를 구현... (2) | 2010.03.12 |
---|---|
트레이 구현하기... (0) | 2010.02.23 |
ListView에 컬럼 동적 제어... (0) | 2010.02.05 |
텍스트박스 라인넘버 넣기! (0) | 2009.10.26 |
디버그윈도우를 만들어서 적용함. (0) | 2009.10.16 |
ListView에 컬럼 동적 제어...
훈스 C#게시판에 올라온 질문중 ListView 컬럼을 동적으로 처리 할수 있는가에 대한 문의.
해당 컬럼을 직접 제어 할수 있는 속성은 없었고 컬럼 자체를 삭제, 추가 등으로 적용이가능하였다. 이때 Index위치가
바뀌는 적절한 Index 셋팅하는 로직도 추가되면 좋을듯 한다.
/*
콤보 1개, ListView 1개
ListView.View = Detail; 컬럼은 그냥 디자이너에서 추가!
콤보에 Items 에는 ListView에 사용한 컬럼명을 등록함.
아래 소스는 콤보 선택시 선택된 ListView 컬럼을 뺌으로써 보이지 않게 처리 할수 있음.
*/
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
ColumnHeader oldch = null;
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if (oldch != null)
{
listView1.Columns.Add(oldch);
oldch = null;
}
oldch = listView1.Columns[Convert.ToInt16(comboBox1.SelectedItem)];
listView1.Columns.Remove(oldch);
}
}
'# 2) .Net ( Vs 2005 ) > WinForm' 카테고리의 다른 글
트레이 구현하기... (0) | 2010.02.23 |
---|---|
데이타 그리드 뷰에 콤보 컬럼에 대한 값 읽기... (0) | 2010.02.05 |
텍스트박스 라인넘버 넣기! (0) | 2009.10.26 |
디버그윈도우를 만들어서 적용함. (0) | 2009.10.16 |
작업트레이위에 스르륵!! 나타나는 폼! (0) | 2009.10.06 |