C# Error Collections [C#관련 팁들]

C# Error Collections [C#관련 팁들]

객체(클래스, 구조체) 등을 배열로 선언하기

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

Q : Ftpproc[] ftc = new Ftpproc(this); 이건 형식이 다르다고 안되구

A :

음, 소스의 내용은 잘 이해가 안 가는데요,..

어쨌거나, 원하시는게 아래와 같은게 아닌지 ???

Ftpproc[] ftc = new Ftpproc[3];

ftc[0] = new Ftpproc(this);

ftc[1] = new Ftpproc(this);

ftc[2] = new Ftpproc(this);

c#의 문법적인 부분이긴 합니다만.... .. .

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

struct 선언법

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

using System;

namespace SoonERP.soon {

public struct pnode

{

public string memid;

public string memname;

public string upnmemid;

public string jumin;

public string telno;

public bool marked;

}

public class main

{

pnode node = new pnode();

//.....

}

}

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

솔루션 내에 다른 프로젝트의 Form 끼리 데이터 공유!

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

Q: 자바를 배울 때 주로 static을 사용해서 데이타를 주고 받았었는데.....

객체지향적 프로그래밍에 어긋나는 것 같고...또 static이 많으니까.... 코드가 깔끔하지가 않아서요...

전에 얼핏 듣기로 static 말고 쉽고 간편한 방법이 있다고 하던데......설명 좀 부탁드립니다..

참 명시적으로 다른 폼의 인스턴스를 생성시키지 않고 하는 방법이 있나 해서요...

예를 들어..

Form1에서 public string form1_Variable; 이라고 선언하고...

Form2에서 Form1 f1 = new Form1(); .........f1.form1_Variable = .......요런거 말구요....

있긴 있다던데.....제가 워낙 얕게 배워서요...기럼 부탁 좀 드리겠습니다.

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

A: 일단 위에 답변 글을 남긴 님의 방식대로 하면 아마두 안될것 같은데...

그 님은 Form1이라는 객체를 Form2에서 새로 생성을 하죠..

그러면 원래 Form1에 텍스트 박스에 있는 내용은 있지만..

새로 Form1이라는 것을 생성하기 때문에 원래 있던 정보는 아마두 접근 할수 없을건데...

제가 잘못 알수도 있구요...

그리구 public으로 변경하는 것은 그다지 좋지 못한 방법입니다...

객체 지향의 특징중의 하나인 캡슐화에 위배되죠...

그럼 제가 하는 방식은요...

만약 폼 A, 폼 B가 있다고 치죠...

님 말씀대로 폼 A에 있는 텍스트 박스가 하나 있구..

폼 B에 텍스트 박스가 있구 버튼이 있다구 치죠...

일단 폼 B가 폼 A를 현 상태에서는 알수가 없죠...

그러니 폼 B가 폼 A라는 객체를 참조해야 폼 B가 폼 A에 무엇이 있다는것을 알수가 있죠...

저는 간단히 하기 위해서 일단 폼A가 메인폼으로 뜰떄 폼B를 생성해서 바로 show시키겠습니다...

그럼 일단 메인폼인 A라는 폼의 Main()부분에

static void Main()

{

Form1 f = new Form1();

Application.Run(f);

}

똑같은 표현이죠...

이렇게 해두시구 Form_Load이벤트에...

private void Form1_Load(object sender, System.EventArgs e)

{

Form2 f = new Form2(this);

f.Show();

}

이렇게 하시구요...

폼 B에서 폼 A의 텍스트 박스에 접근할수 있도록 Property를 하나 만들겠습니다..

public 메소드를 만들어주셔두 되구요...

public string GetTextBox

{

get { return this.textBox1.Text; }

}

지금까지 폼 A에서 작업을 했구요.. 폼 B에서는 일단 Form1이라는 폼 A를 선언하구 생성자부분에..

private Form1 f;

...

...

public Form2(Form1 f)

{

this.f = f;

InitializeComponent();

}

이렇게 하시구요...

이제 버튼을 눌렀을때의 이벤트 처리...

private void button1_Click(object sender, System.EventArgs e)

{

this.textBox1.Text = f.GetTextBox;

}

이렇게 하시면 될겁니다...

이해가 가시죠 *^^*

그럼 즐프~~~

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

포인터 사용법

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

클래스는 다른 방법을 찾아야 할 것 같네요... 일단 구조체를 사용했습니다.

using System;

struct A

{

public int a;

}

class MyMain

{

unsafe static void Main(string[] args)

{

A a=new A();

A* pa = &a;

(*pa).a = 11;

void* vo = &pa;

int pi = (int)vo;

Console.WriteLine(pi);

}

}

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

포인터사용법 2

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

protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)

{

// Using pointers, so we must use the "unsafe" keyword.

unsafe

{

// This data defines the top-down bitmap.

byte[] ptrTopDown =

{255,255,255,255,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,

255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,

255,255,255,255,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,

255,255,255,255,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 };

// This data defines the same bitmap, only with bottom-up data.

byte[] ptrBottomUp =

{255,255,255,255,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,

255,255,255,255,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,

255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,

255,255,255,255,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 };

int xStart = 0;

int yStart = 0;

int width = 4;

int height = 4;

int bytesPerPixel = 4;

int scanlineWidth = bytesPerPixel * width;

// We must obtain a pointer to the first scanline of the top-down data.

// This happens to be the start of the buffer.

fixed (void* p = ptrTopDown)

{

IntPtr ptr = new IntPtr(p);

PixelFormat format = PixelFormat.Format32bppRgb;

Bitmap bitmapImage = new Bitmap(width,height,scanlineWidth,format,ptr);

Rectangle destRect1 = new Rectangle(0, 0, width, height);

GraphicsUnit units = GraphicsUnit.Pixel;

e.Graphics.DrawImage(bitmapImage, destRect1, xStart, yStart, width, height, units);

}

//Because this is bottom-up bitmap data, we must obtain a pointer to

//the beginning of the last row of pixels in the buffer, which is the topmost scanline

//seen when the image is drawn.

int desiredRow = 3;

// Zero-based desired row. We want the fourth

// row from the top, because that is the start of the

// last row of pixels in the buffer.

fixed (void* p = &ptrBottomUpdesiredRow; * scanlineWidth)

{

IntPtr ptr = new IntPtr(p);

PixelFormat format = PixelFormat.Format32bppRgb;

Bitmap bitmapImage = new Bitmap(width,height,-scanlineWidth,format,ptr);

Rectangle destRect1 = new Rectangle(10, 0, width, height);

GraphicsUnit units = GraphicsUnit.Pixel;

e.Graphics.DrawImage(bitmapImage, destRect1, xStart, yStart, width, height, units);

}

}

}

동적으로 이미지를 생성해서 화면에 뿌리는 예제입니다.

지금 하신 코드에 적절하게.. 바꿔서 넣어주시면 될것 같네요 ^^;--------------------------------------------------------------------------------

unsafe image processing

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

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dncscol/html/csharp11152001.asp

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

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

C#에서 UDP통신에서 바이너리 데이터 전송은 직렬화(Serialize)를 사용해야 한다.

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

안녕하세요 네트웍 프로그램을 만들고 있는데

프로토콜 객체를 직렬화한후 이를 바이트 배열로 전송하여 상대

에서 다시 비직렬화 하여 구성하는 중 자꾸 에러가 발생합니다.

"End of Stream encountered before parsing was completed." 에러의 내용은 다음과 같이 나오며

코드는 다음과 같습니다.

// 메모리 스트림 생성.

MemoryStream stream = new MemoryStream();

BinaryFormatter formatter = new BinaryFormatter();

// 직렬화 수행.

formatter.Serialize(stream, this.mGCSP);

byte[] buf = new Byte[stream.Length];

// 메모리 스트림의 오프셋 설정

stream.Position =0;

stream.Read(buf, 0, buf.Length);

// 소켓으로 전송 부분.

this.mSocket.Send(buf, 0, buf.Length, SocketFlags.None);

...

...

// 이 데이터를 다시 역직렬화 하는 부분,

stream.Position =0;

stream.Write(buf, 0, buf.Length);

// 여기서 에러 발생!.

GCSP gcsp = (GCSP)formatter.Deserialize(stream);

혹시 이런 문제점에 대해서 잘 아시는 분은 답변부탁 드립니다.

그럼 좋은 하루 보내세요

위와 같이 직렬화 하면 됨...해결하고 수정해 놓은 소스...

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

C# WinForm에서의 다른 컨트롤에 의한 스크롤...(걍 스크롤)

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

안녕하세요!

일반적으로 이 클래스는 직접 사용하지 않습니다. ContainerControl 및 Panel 클래스는 이 클래스에서 상속됩니다.

ScrollableControl 클래스는 스크롤 기능이 필요한 컨트롤에 대한 기본 클래스 역할을 수행합니다. 필요할 때 컨트롤에서 스크롤 막대 를 표시하도록 하려면 AutoScroll 속성을 true로 설정하고 AutoScrollMinSize 속성을 원하는 크기로 설정합니다. 컨트롤이 지정한 최소 크기보다 작게 조정되거나 자식 컨트롤이 컨트롤의 범위 밖에 있으면 해당 스크롤 막대가 표시됩니다.

표시되는 스크롤 막대를 수동으로 재정의하려면 VScroll 및 HScroll 속성을 설정합니다. 두 가지 속성 중 하나가 false로 설정되어 있으면 AutoScroll 속성이 true로 설정되어 있어도 해당 스크롤 막대가 표시되지 않습니다.

가장 대표적인 컨트롤로 Panel 컨트롤을 들수 있습니다.

Panel은 다른 컨트롤을 포함하는 컨트롤입니다. Panel을 사용하면 컨트롤의 컬렉션을 RadioButton 컨트롤 그룹과 같이 그룹화할 수 있습니다. GroupBox 컨트롤 등의 다른 Container 컨트롤과 같이 Panel 컨트롤의 Enabled 속성이 false로 설정되어 있으면 Panel에 포함된 컨트롤도 사용할 수 없게 됩니다.

기본적으로 Panel 컨트롤은 테두리 없이 표시됩니다. BorderStyle 속성을 사용하여 표준 또는 3차원 테두리를 제공하면 패널 영역을 폼의 다른 영역과 구별할 수 있습니다. Panel 컨트롤은 ScrollableControl 클래스에서 파생되므로 AutoScroll 속성을 사용하면 Panel 컨트롤에서 스크롤 막대를 활성화할 수 있습니다. AutoScroll 속성이 true로 설정되어 있으면 제공된 스크롤 막대를 사용하여 볼 수 있는 영역 외부에서 Panel 안의 모든 컨트롤을 스크롤할 수 있습니다.

도움이 되셨는지 모르겠습니다.

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

웹브라우저 컨트롤(Microsoft 웹브라우저/ActiveX)

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

private AxSHDocVw.AxWebBrowser axWebBrowser1;

private System.ComponentModel.Container components = null;

public Form1()

{

InitializeComponent();

object a = 0;

object b = 0;

object c = 0;

object d = 0;

this.axWebBrowser1.Navigate("www.google.com",ref a,ref b,ref c,ref d);

}

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

mp3재생

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

using QuartzTypeLib;

을 하시구요.

IMediaControl m_IMediaControl;

m_IMediaControl = new FilgraphManager();

m_IMediaControl.RenderFile("C:\Test.mp3");

m_IMediaControl.Run();

이렇게 하시면 음악이 흘러 나옵니다.

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

x버튼 눌렀을때 처리

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

폼에서 x(닫기)버튼을 클릭하던가 폼의 close()메서드를 실행하면

폼이 닫히게 되잖아여..

이때...폼의 closing()이벤트를 발생시키면여..

폼이 닫히는동안에 처리하는 코드를 넣을수 있어여...

여기서 폼이 닫히는 것을 취소하구여..

원하는 코드를 넣으면 되겠져...

Form의 ShowInTaskbar 속성 Visible속성을 조절하도록 말이져..

글구 트레이의 Visible을 트루로 하면 되겠져...

private void form_Closing(sender,e)

{

e.Cancel=true; //폼닫기 취소

this.Visible = false; //폼 안보이게...

this.ShowInTaskbar = false; //태스크바에서 안보이게..

this.tray.Visible = true; //트레이아이콘 보이게..

}

트레이에서 다시 폼을 보려면 트레이의 클릭이나 더블클릭이벤트에

적절한 코드를 넣으면 되겠져...

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

PrintDialog

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

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemDrawingPrintingPrintPageEventArgsClassGraphicsTopic.asp

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cscon/html/vclrfcodeprintpreviewingformvisualc.asp

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

특정영역 비트맵 복사

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

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dncfhowto/html/copybr.asp

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

폼 닫기 버튼 무효화

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

폼에서 x(닫기)버튼을 클릭하던가 폼의 close()메서드를 실행하면

폼이 닫히게 되잖아여..

이때...폼의 closing()이벤트를 발생시키면여..

폼이 닫히는동안에 처리하는 코드를 넣을수 있어여...

여기서 폼이 닫히는 것을 취소하구여..

원하는 코드를 넣으면 되겠져...

Form의 ShowInTaskbar 속성 Visible속성을 조절하도록 말이져..

글구 트레이의 Visible을 트루로 하면 되겠져...

private void form_Closing(sender,e)

{

e.Cancel=true;

this.Visible = false;

this.ShowInTaskbar = false;

this.tray.Visible = true;

}

트레이에서 다시 폼을 보려면 트레이의 클릭이나 더블클릭이벤트에

적절한 코드를 넣으면 되겠져...

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

스레드 때문에 프로그램 종료가 안될때

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

음,, 저하고 같은 고민을 하셨군요..

먼저 다음과 같이 한번 해보세요

using System.Diagnostics;

protected override void Dispose( bool disposing )

{

if( disposing )

{

if(components != null)

{

components.Dispose();

}

}

base.Dispose( disposing );

// 이부분에 추가합니다.

if( _thread.IsAlive ) // th = 생성한 쓰레드 객체

_thread.Abort();

Process [] p_arr = Process.GetProcessesByName("EReceiver"); // 즉 *.exe 로 생성될떄 exe 를 뺸 이름

foreach( Process p in p_arr)

p.Kill();

}

저는 이와같이 해서 해결했습니다. 도움이 되시길..

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

asp와 asp.net의 쿠키의 차이점

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

ASP의 경우 쿠키를 기록하고 읽을때 자동으로 UrlEncode와 UrlDecode를 수행합니다.

ASP.NET의 경우에는 쿠키를 그런 자동화된 처리를 하지 않지요~

그래서 한글 쿠키값의 경우에 어느 한쪽에서 기록한 정보를 다른쪽에서 읽으려 할때에 차이가 생기게 되는것입니다.

해결방법은 쿠키접근을 ASP.NET에서만 하시거나 ASP와 공유가 반드시 필요하다면

ASP.NET에서 쿠키값을 기록할때 UrlEncode 하시고, 읽을때 UrlDecode 하셔서 ASP방식에 맞춰줘야 할것 같습니다.

제가 알기로는 ASP에서 기본 Encode/Decode를 하지 않도록 설정하는 방법이 없는것으로 알고 있어서...

(혹시 그런 방법을 알고 계신분이 있으시면 한 수 가르쳐 주시길 바랍니다~ ^^;)

-아래 주소는 한국 마이크로소프트사의 해당부분 기술자료입니다.

http://support.microsoft.com/default.aspx?scid=kb;ko;313282

도움이 되셨길...

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

사용자 정의 컨트롤(ascx) 사용하기

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

<%@ Register Tagprefix="MAIN(태그프리픽스명)" TagName="bottom(태그명)" Src="/bottom.ascx(경로)"%>

(위에 src에 들어갈 파일확장자 명은 꼭 ascx이어야 합니다.)

aspx 파일 맨위에 위처럼 넣어주시고

include할 곳에 담과 같은 태그를 넣어주시면 됩니다.

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

사용자 정의 컨트롤 동적으로 사용하기

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

(1) UserControl BehindCode 에서 Visible 속성 사용하기

1. 원하는 위치에 UserControl을 여러개 배치한다.

2. ASPX Page에서 Visibe=False or True 속성 사용(Optional)

3. 컨트롤 선언(해당 UC가 속한 프로젝트의 DLL을 Reference.)

4. Protected UC_ID AS UC_TAGName(컨트롤을 선언한다.)

4. UC_ID.visible=false or True

전 이렇게 UC를 동적으로 표현하는데요... 다른분들은 어떻게 하시는지 모르겠네요..

동적으로 생성하는 건 아니지만, 단순히 Visible 속성만으로 원하는 UserControl을 보여주는 방법을 씁니다.

(1) 서버객체 이용하기

HTML에서

이렇게 테이블이 있고 저기 body라는 셀에다가

유저컨트롤을 로드 시키고 싶다고 합니다.

그럴경우..

cs에서

이렇게 먼저 body라는 테이블 셀을 선언하시고

protected System.Web.UI.HtmlControls.HtmlTableCell body;

body.Controls.Add(Page.LoadControl("경로+파일명"));

이렇게 LoadControl을 하게 되면 됩니다

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

MDB사용 쿼리 시 ____

select ~ where (필드) like '%' 는

MDB(ACCESS)에서

select ~ where (필드) like '*' 는

가 되나

C#과 같은 쿼리 엔진이 있는 곳에서 쿼리를 날릴땐

select ~ where (필드) like '%' 그대로 사용한다.

참고 날짜는 '2002-10-10' --> #2002-10-10#

from http://lovapi.tistory.com/82 by ccl(A) rewrite - 2020-03-07 09:56:39

댓글

이 블로그의 인기 게시물

HTML 13단계 - 폼(Form) 1탄

임시 인터넷 파일캐싱을 위한 방지 html,css,javascript

[C#]Log4Net 사용법