SharedIT | 묻고 답하기(AMP)

윈폼 tcp/ip 기반데이터그리드뷰질문좀드리겠습니다

if (s.Contains(","))

{

string[] arr = s.Split(',');

dt = new DataTable();

dt.Columns.Add("num");

dt.Columns.Add("data");

dt.Rows.Add(arr[0], arr[1]);

dataGridView1.DataSource = dt;


dataGridView1.AllowUserToAddRows = true;





}

제가현재 클라이언트측에서 데이터를     , 를포함하여받게되면

그리드뷰로 자동저장이되게만들었는데요


이상하게 처음데이터를받으면 저장이 잘되는데

두번쨰데이터를 받게되면 처음에받앗던데이터가 사라지고 그위에 2번쨰데이터가 그리드뷰로넘어갑니다

행추가도되지않고 첫번쨰위에덮어쓰기가되버리네요... 해결방법이뭘까요 ..

Tags : 태그가 없습니다.

4개의 답변이 있습니다.

hgp33
  0 추천 | 일 년 이상 전

데이터 테이블 생성자와 컬럼 생성을 if문 밖으로 빼세요~ 데이터 테이블 new 키워드만 if만 밖으로 빼시면 아래 add.columns 때문에 데이터가 들어올때마다 컬럼이 늘어나게 됩니다. 그리고 dataSource를 재지정해주전에 dataSource = null;을 넣어서 이전 바인딩된 테이블을 지우시는게 더 안정적입니다.

hgp33 | 일 년 이상 전

dt = new DataTable();

dt.Columns.Add("num");

dt.Columns.Add("data");


dataGridView1.AllowUserToAddRows = true;


if (s.Contains(","))

{

string[] arr = s.Split(',');

dt.Rows.Add(arr[0], arr[1]);


if (dataGridView1.DataSource  != null ){

dataGridView1.DataSource = null;

}

dataGridView1.DataSource = dt;

}

미생
  0 추천 | 일 년 이상 전

wansoo님이 설명하신 데이터의 영역문제인데 

if로 필요한 조건이 발생한 데이터 1개에 대해서는 완벽하게 동작하나, 반복문이 있는 상태에서라면 

dataGridView1 라는 객체는 밖에 있고, 여기에는 데이터가 잠시간 보이나, 이 객체에서 보여줘야 할 데이터소스인 dt라는 객체는 if문을 벗어나는 순간 소실되는 문제가 발생합니다.


차니님 말씀도 맞기 때문에 


dt = new DataTable();


if (s.Contains(","))

{

string[] arr = s.Split(',');

dt.Columns.Add("num");

dt.Columns.Add("data");

dt.Rows.Add(arr[0], arr[1]);

dataGridView1.DataSource = dt;


dataGridView1.AllowUserToAddRows = true;

}


의 형태로 선언부를 일부 수정해주시면 정상적인 작동이 가능할 것으로 생각됩니다.

미생 | 일 년 이상 전

만약 ,이 들어간 뭔가를 만났을때 1개이면 정상작동 되어 보이는데

2번째부터는 1,234,567,890이 되는 순간 

1번째 if가 돌때 1 이 보이고,

2번째 if가 돌때 1 밑에 234가 보이는게 아니고 234를 뿌려주고

3번째 if가 돌때 567이 보이고

4번째 if가 돌때 890이 보이실거에요.

디버그를 하고 싶으시다면 중간에 alert이나, breakpoint등을 두시고 멈추면서 보시면 아마 동작이 좀더 수월하게 보이실거로 생각됩니다.

wansoo
  0 추천 | 일 년 이상 전

C#을 대충 맛배기로만 공부하고...

다시 안 본지가 오래 되긴했는데...

앞에 받은 데이터가 사라지고, 뒤에 받은 데이터 하나만 저장되어 있다는 내용인것 같은데요.

객체 지향 언어에서 흔히 겪게 되는 유사한 증상들 중에 하나가...

앞에 데이터를 저장할때 사용한 객체와 다음에 받은 데이터를 저장하는 객체가 다를 경우가 많은 것 같고요.

예를 들어서 로컬 도메인의 객체를 만들어서 자료를 넣어 두고, 다음번에 데이터를 받을 때 다시 로컬 도메인의 객체를 다시 만들어서 데이터를 저장하는 방식일 경우에 앞에 로컬 도메인 객체는 일시적으로 생성되었다가 사라져 버리기 때문에 초기화 되어 버리고, 뒤에 다시 만들어진 객체는 앞에 만들어진 객체와는 무관한 새로운 객체가 되겠고요.

이를 해결하기 위해 객체를 전역 선언해 준다거나 정적 객체로 정의 해 준다 거나 등의 방법을 사용해야 하지 않을까 싶고요.


C 언어에서도 { } 안에서 만들어진 변수는 { }를 벗어 나면 사라져 버리게 되기 때문에 { } 밖에서 정의해서 { }에서 사용하는 형식으로 사용해 줘야 { } 밖에서도 사용할 수 있는 변수가 될 수 있겠고요.


자료를 좀 찾아 보고 답글을 적기에는... 시간을 너무 많이 소비해야 할 것 같아서 추정하는 내용으로 답글을 적고 있는데...

dt 라는 객체를 if문의 { }에서 생성해 주었기 때문에 if 문을 벗어나고 나면 사라져 버리는 로컬 객체가 되지 않나 하는 생각이 드네요.

차니
  0 추천 | 일 년 이상 전

 new DataTable이 루프문내에 있는 건 아닌지요?


프로그램 해본지도 십수년전이네요^^