Microsoft MVP성태의 닷넷 이야기
c# 윈폼 tcp/ip 기반 데이터그리드뷰질문하나드리겟습니다 [링크 복사], [링크+제목 복사],
조회: 11659
글쓴 사람
김경환
홈페이지
첨부 파일
 

안녕하세요 선생님 저번에 질문드렸엇던사람입니다.

컨트롤이 데이터 바인딩된 경우에는 DataGridView의 행 컬렉션에 프로그래밍 방식으로 행을 추가할 수 없습니다 라는오류가 발생하였는데
방법을 여기저기 찾아보고알아봤는데도 잘되지가않아서질문드립니다..



namespace MultiChatServer {
    public partial class ChatForm : Form {
        delegate void AppendTextDelegate(Control ctrl, string s);
        AppendTextDelegate _textAppender;
        Socket mainSock;
        IPAddress thisAddress;

        public ChatForm() {
            InitializeComponent();
            mainSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
            _textAppender = new AppendTextDelegate(AppendText);
            DataTable table = new DataTable();
            table.Columns.Add("F");
            table.Columns.Add("Number", typeof(int));
            table.Columns.Add("Data", typeof(float));
            table.Columns.Add("E");
       

            dataGridView1.DataSource = table;
        }//선언

        


        void AppendText(Control ctrl, string s) {

           
            if (ctrl.InvokeRequired) ctrl.Invoke(_textAppender, ctrl, s);
            else
            {
                string source = ctrl.Text;
                ctrl.Text = source + Environment.NewLine + s;

            }


           
            

        }

        void OnFormLoaded(object sender, EventArgs e) {
            IPHostEntry he = Dns.GetHostEntry(Dns.GetHostName());

       
            foreach (IPAddress addr in he.AddressList) {
                if (addr.AddressFamily == AddressFamily.InterNetwork) {
                    thisAddress = addr;
                    break;
                }
            }

          
            if (thisAddress == null)
      
                thisAddress = IPAddress.Loopback;

            txtAddress.Text = thisAddress.ToString();
        }
        void BeginStartServer(object sender, EventArgs e) {
            int port;
            if (!int.TryParse(txtPort.Text, out port)) {
                MsgBoxHelper.Error("포트 번호가 잘못 입력되었거나 입력되지 않았습니다.");
                txtPort.Focus();
                txtPort.SelectAll();
                return;
            }

            IPEndPoint serverEP = new IPEndPoint(thisAddress, port);
            mainSock.Bind(serverEP);
            mainSock.Listen(10);

            
            mainSock.BeginAccept(AcceptCallback, null);
        }

        List<Socket> connectedClients = new List<Socket>();
        void AcceptCallback(IAsyncResult ar) {
           
            Socket client = mainSock.EndAccept(ar);

           
            mainSock.BeginAccept(AcceptCallback, null);

            AsyncObject obj = new AsyncObject(4096);
            obj.WorkingSocket = client;

          
            connectedClients.Add(client);
            
            AppendText(txtHistory, string.Format("사용자 (@ {0})가 연결되었습니다.", client.RemoteEndPoint));

            
            client.BeginReceive(obj.Buffer, 0, 4096, 0, DataReceived, obj);
        }

        void DataReceived(IAsyncResult ar) {
            AsyncObject obj = (AsyncObject)ar.AsyncState;

           
            //예외처리 구문 (튕김방지)
            string text = Encoding.UTF8.GetString(obj.Buffer);

            
            string[] tokens = text.Split(' ');
            string ip = tokens[0];
            string msg = tokens[0];

           
            AppendText(txtHistory, string.Format("[받음]{0}: {1}", ip, msg));
            
            
            for (int i = connectedClients.Count - 1; i >= 0; i--) {
                Socket socket = connectedClients[i];
                if (socket != obj.WorkingSocket) {
                    try { socket.Send(obj.Buffer); }
                    catch {
                       
                        try { socket.Dispose(); } catch { }
                        connectedClients.RemoveAt(i);
                    }
                }
            }

            try
            {
                int received = obj.WorkingSocket.EndReceive(ar);
            }
            catch (Exception e)
            {
                string Message = "서버가 끊어졌습니다" + e.Message;
                MessageBox.Show(Message);
                return;
            }


            obj.ClearBuffer();

         
            obj.WorkingSocket.BeginReceive(obj.Buffer, 0, 4096, 0, DataReceived, obj);
        }

        void OnSendData(object sender, EventArgs e) {
            
            if (!mainSock.IsBound) {
                MsgBoxHelper.Warn("서버오프라인 상태");
                return;
            }
            
            
            string tts = txtTTS.Text.Trim();
            if (string.IsNullOrEmpty(tts)) {
                MsgBoxHelper.Warn("텍스트가 입력되지 않았습니다!");
                txtTTS.Focus();
                return;
            }
            
           
            byte[] bDts = Encoding.UTF8.GetBytes(thisAddress.ToString() + '\x01' + tts);

           
            for (int i = connectedClients.Count - 1; i >= 0; i--) {
                Socket socket = connectedClients[i];
                try { socket.Send(bDts); } catch {
                   
                    try { socket.Dispose(); } catch { }
                    connectedClients.RemoveAt(i);
                }
            }

            
            AppendText(txtHistory, string.Format("[보냄]{0}: {1}", thisAddress.ToString(), tts));
            txtTTS.Clear();
        }

        private void lblPort_Click(object sender, EventArgs e)
        {

        }

        private void txtHistory_TextChanged(object sender, EventArgs e)
        {
            string[] lines = txtHistory.Lines;
            string[] row0 = { "", "", "", "" };
            dataGridView1.Rows.Add(row0);
            dataGridView1.DataSource = lines;
        }

        private void lblAddress_Click(object sender, EventArgs e)
        {

            
        }

        private void tblMainLayout_Paint(object sender, PaintEventArgs e)
        {

        }

        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {

        }
    }
}

txthistory쪽에 클라이언트측에서 발신되는 채팅창에 수식을넣어줌으로써 자동으로 데이터그리드뷰로 이동하려고하는데 이와같은오류가 뜨는데 무엇이문제일까요...













[최초 등록일: ]
[최종 수정일: 9/26/2022]


비밀번호

댓글 작성자
 



2022-09-26 06시14분
소스 코드를 바로 실행 가능한 프로젝트로 첨부해서 올려 주세요. 그리고 "이와 같은 오류"가 어디서/무슨 오류를 말하는 건가요?
정성태
2022-09-28 09시25분
[김경환] 프로젝트첨부가안되네요 ..ㅠㅠ
private void txtHistory_TextChanged(object sender, EventArgs e)
        {
            string[] lines = txtHistory.Lines;
            string[] row0 = { "", "", "", "" };
            dataGridView1.Rows.Add(row0);
            dataGridView1.DataSource = lines;
        }

여기 소스에서 dataGridView1.Rows.Add(row0);에 컨트롤이 데이터 바인딩된 경우에는 DataGridView의 행 컬렉션에 프로그래밍 방식으로 행을 추가할 수 없습니다
라는 오류가 나오는데 구글링을해도 무슨소리인지 이해가잘가지않습니다선생님...
[guest]
2022-09-28 10시18분
"파일 첨부 시 .zip, .png, .jpg만 가능하며 압축 파일인 경우 내부에 bin, obj, .vs 디렉터리가 포함되어 있으면 글 쓰기가 안 됩니다."

첨부해서 올려주세요, 질문하시는 분들은 한 명이지만, 답변하는 제 입장에서는 일일이 질문에 해당하는 코드를 위해 프로젝트를 만들어 구성하는 것도 적잖이 시간을 쓰게 되니 이해를 부탁드립니다.

그리고, 해당 오류는, DataSource에 이미 출력 데이터를 위한 컬렉션이 설정돼 있으므로 이후부터는 임의로 Rows를 통해 변경을 할 수 없다는 의미입니다. 그런 경우에는 원래의 DataSource에 설정한 (위의 경우에는 lines) 컬렉션에 변화를 주거나, 아니면 DataSource를 재설정하는 방법으로 변경해야 합니다.
정성태

... 61  62  63  64  65  66  67  68  69  70  71  [72]  73  74  75  ...
NoWriterDateCnt.TitleFile(s)
756손승휘3/24/200818703Microsoft Web Browser OCX 부분이 안전하지 않는 ACTIVEX로 IE에서 인식되어는 점 [1]
754단테3/19/200815816실행파일의 아이콘을 프로그램 적으로 변경할 수 있을까요? [1]
753신동열3/12/200816551비스타의 권한 상승 관련 질문 있습니다. [2]
751김재영3/6/200815710스레드와 비스레드간의 대기상태 순서에 대해 질문이 있습니다. [2]파일 다운로드1
752정성태3/7/200815257    답변글 [답변]: 스레드와 비스레드 간의 대기 상태 순서에 대해 질문이 있습니다. [1]
750김용현3/3/200814650스마트 클라이언트로 파일 다운로드시 파일의 크기가 0인 경우가 발생합니다. [2]
749임영한2/28/2008302032003서버에서 msxml3.dll 오류 "80070005" 문제입니다. [2]
748류재상2/27/200819265Remoting , Tcp Channel 사용시.. 외부에서 접근 보안문제... [3]
747한귀순2/20/200817608WinForm - DataGridView 소계 등 [3]
746박상영2/20/200815560리모팅 관련해서 [3]파일 다운로드1
745조승현2/20/200816231Response.Charset ANSI로 설정..하는부분이 어려워서요.. [1]
744오야2/5/200814880멤버십, 웹파트등의 생성테이블과 업무테이블간의 관계를 어떻게.. [2]
743김기룡1/29/200816710동일 이미지 판단 방법 관련 [2]파일 다운로드1
740경혜원1/28/200818126C#에서 이런게 가능 할런지요?
742정성태1/29/200816178    답변글 [답변]: C#에서 이런게 가능 할런지요? [1]
738임경훈1/25/200817020웹서비스에서 오라클DB에 연결할 때
741임경훈1/28/200816549    답변글 [답변]: 웹서비스에서 오라클DB에 연결할 때 [1]
737단테1/25/200817934안녕하세요 정성태님. C Run-time Library의 배포에 대해서 질문있습니다. [3]
736김현기1/24/200815655XML 접두어 포함한 XmlElement 작성법? [1]
735정명원1/9/200815513ActiveX 사용시 ... [2]
734제영한12/17/200715472웹서비스에서 사용자 정의 예외 사용하기 [2]
732김기룡12/3/200718528WebRequest 요청시 일본어 인코딩 관련 문의파일 다운로드1
733김기룡12/3/200714631    답변글 일어가 깨졌네요..테스트 문자 추가합니다.^^;;파일 다운로드1
739adnim1/27/200816079    답변글 [답변]: WebRequest 요청시 일본어 인코딩 관련 문의 [1]
731우기11/27/200713321[질문] clickonce 배포시 .net framework 2.0, 3.0 설치 시간 줄일 수 있는 묘수없을까요?? [1]
730김재영11/10/200714089스레드에 사용되는 함수에 값을 같이 넘기는 방법이 있습니까?? [2]파일 다운로드1
... 61  62  63  64  65  66  67  68  69  70  71  [72]  73  74  75  ...