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

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

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

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

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

1  [2]  3  4  5  6  7  8  9  10  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
5786De...1/9/2023269익명 클래스 말고 익명 구조체는 불가능한걸까요? [4]
5785음성...1/8/2023142음성인식 System.Speech - 문법에 사용된 언어가 음성 인식기의 언어와 일치하지 않습니다. [2]
5784MS...1/8/2023164MS워드에서 ctrl Z는 클립보드를 이용하나요? 아니면 참조자 이용하나요? [7]
5783구직자1/7/2023286C#개발자 구인광고와 초급개발자 [3]파일 다운로드1
5782Sq...1/5/2023223윈도우11 노트북에서 exe(Sqlite)만들어 윈도우 7 PC에 설치 시 [5]
5781Li...1/5/2023287List.Add("newobj") 속도는 빠른 편인지요? [11]
5780임세1/3/2023249C# 프로그래밍 10 책 구매한 사람입니다. 3부 자료는 어디서 다운 받을 수 있나요? [4]
5779이건우1/2/2023191안녕하십니까 루프안에서 메세지처리에 관하여 질문드립니다! [2]
5778이건우12/30/2022295안녕하세요 c#에서 dll참조 관련 질문드립니다. [4]
5777감사...12/29/2022195UI Thread에 Invoke 처리관련 궁금합니다. [3]
5776pd...12/28/2022297C# MouseUp Event + pdf [10]
5775민성12/28/2022204안녕하세요 Class 관련해서 예외처리를 하나로 받아낼수 있는 방법 [1]
5774중급12/27/2022470중급개발자란 어느 수준인지요? [4]
5773김영식12/26/2022234c# 압축파일 읽어 올 때 BinaryRead 한글 처리 문제 [1]
5772눈송이12/26/2022254Excel VSTO 는 왜 Net Core, Net 5, 6 버전을 사용하지 않나요? [2]
5771김훈12/26/2022198c# .net client application 망분리(내부망,외부망) 환경에서 의문의 외부사이트 호출 대기 [2]
5770lsh12/26/2022164클라우디움안에 있는 파일을 File.Copy 하고싶은데 코드로는 접근을 못하나요? [1]
5769울타리12/20/2022215Active Directory 2012R2 2016 또는 2019 마이그렝션 문의 드립니다. [1]
5768c++12/14/2022334Thread를 사용한 C++ DLL에 관련된 질문입니다. [6]파일 다운로드2
5767민성12/9/2022253안녕하세요 ashx로 화일을 저장하고 화일명을 리턴하는데요 [1]
5766김명훈12/9/2022325웹브라우저에서 묻지 않고 바로 다운로드 [2]
5765ho...12/1/2022312Winform(.Net6) 클라이언트에서 SignalR Core 웹서버에 접속시 인증서 문제 [3]파일 다운로드1
5764요한11/30/2022329c++ 동일한 객체인지 비교 방법문의 [2]
5763고필석11/30/2022270시작하자마자 비정상 종료하는 프로세스에 대한 문제 해결 조언 요청 드립니다. [3]
5762흰털...11/30/2022314wpf mvvm ui update 로딩중 표시 [1]
5761민성11/29/2022267죄송하지만 한가지만 더 여쭈어 보겠습니다 [1]
1  [2]  3  4  5  6  7  8  9  10  11  12  13  14  15  ...