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

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

컨트롤이 데이터 바인딩된 경우에는 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를 재설정하는 방법으로 변경해야 합니다.
정성태

... 16  17  18  19  [20]  21  22  23  24  25  26  27  28  29  30  ...
NoWriterDateCnt.TitleFile(s)
5429종범12/16/20207267[WPF] Task 관련 질문 드립니다. [1]파일 다운로드1
5428최선호 donator12/14/20206854성태님 ㅠ.ㅠ 소켓 서버 작동이 이상합니다 ㅠ.ㅜ [1]파일 다운로드1
542712/11/20207455LPBOOL Win32 마샬링 질문이 있습니다. [6]
5426하태12/11/20205723안녕하세요 정성태님! C# winform Calendar 컨트롤 질문 드리겠습니다!. [1]
5425정유경12/10/20205767[왕초보] (4) [1]
5423정유경12/8/20206123[왕초보] (3) [2]
5422이승준12/7/20209539VisualStudio 2019의 인텔리센스가 느려지는 경우가 있나요? [4]
5421정유경12/6/20207200[왕초보] (2) [4]
5420정유경12/5/20206741[왕초보] 랜덤 숫자와 배열에 관한 질문 [1]
5419종범12/4/20207188[WPF] Threadpool사용 시 크리티컬 섹션 대응 질문 입니다. [4]
5418한예지 donator11/27/20207413클래스, 인터페이스 크기를 구하고 싶은데 어떻게 해야 될까요? [1]
5417한예지 donator11/27/20206052인터페이스와 추상클래스에 대해 궁금증이 있습니다. [1]
5416한예지 donator11/27/20205884Object 질문 있어요. [1]
5415한예지 donator11/25/20205963교재 213쪽 예제 4.25 질문드립니다. [1]
5414한예지 donator11/23/20206818제네릭 리스트 출력하는 방법이 궁금합니다. [1]
5413민석11/20/20207367C# minidump를 프로그램이 중단 될 때 만들고 싶습니다. [1]파일 다운로드2
5411원격11/20/20205896visualstdio로 웹 사이트로 만들었을때 원격 디버깅이 가능한가요? [1]
5410최성재11/16/20206256vcpkg로 GDCM 내려받을 때 USE_VTK 설정하는 방법-2번째 질문 [1]파일 다운로드1
5409민성11/16/20209266혹시 다른 질문이긴 한데요 [1]
5408최성재11/16/20206533vcpkg로 GDCM 내려받을 때 USE_VTK 설정하는 방법 [1]
5407민성11/11/20205920안녕하세요 yield return에 대해서 [1]
5406질문자11/10/20206340안녕하세요 wcf nettcpbinding의 timeout에 관해서 질문이 있습니다. [2]
5405민성11/9/20207108안녕하세요 이번에도 또 어려운 질문 같습니다. [1]
5404박진우11/6/20207458안녕하세요. SqlParameter 생성자 관련 질문 있습니다. [1]
5403민성11/5/20207524그리고 한가지만 죄송하지만 더 질문 드리겠습니다. [1]
5402민성11/5/20207739안녕하세요 책을 보고 질문하나만 드릴깨요 [2]
... 16  17  18  19  [20]  21  22  23  24  25  26  27  28  29  30  ...