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

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

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

... 31  32  [33]  34  35  36  37  38  39  40  41  42  43  44  45  ...
NoWriterDateCnt.TitleFile(s)
5044엿장수8/20/20188505graphedit 에 등록되어있는 필터를 가져와서 사용하는방법을 알고싶습니다 [2]
5043hori...8/20/20188159Expression에 대한 책의 예제 관련하여 질문드립니다. [1]
5042황윤하8/20/20189898모드버스 TCP 관련 질문 [3]
5041david8/18/20189543.NET WebAPI 에서 Response 지연되는 이유 [3]
5040농상8/14/20188988정규표현식에 대해서 [3]
5039유영태8/14/201810558비동기 소켓사용후 해당 스레드가 남아있을때 처리 방법 [4]파일 다운로드1
5038이정석8/9/20188715서버파일 로컬파일 비교 [2]
5037jjh8/8/201811984c# 으로 화면캡쳐해서 동영상으로 만드는앱을 만들고싶습니다 [6]
5036볼딱지8/8/20189852C# programming 개발 관련 질문이 있습니다. [1]
5035궁금합니...8/8/201810464C# 버전 고민 어떤 책을 사야하나요? [1]
5034신동열8/8/20188980덤프 파일 분석 관련해서 문의 드려요. [1]
5033최규성8/7/201811058C# WinForm, Oracle 9i 로 프로그래밍시 ODP.NET, 배포 설정 방법 질문입니다. [6]
5032이정석8/6/201812882C# 으로 만들 dll 등록 [7]
5031J.S.8/6/20188519System.Array class의 구조에 대한 질문 [1]
5030농상8/4/20189013람다 식을 이용한 메서드 정의 확대를 공부하고 있습니다. [2]
5029Soul...8/3/20188528C# ActiveX 컨트롤 질문드립니다. [4]
5028도토리8/1/20189071혹시 회사에서 TFS 구축시 SQL-Server 라이선스 정책 아시는분 계신지요? [2]
5027농상7/31/20189825Freachable Queue의 발음을 표기하면 어떨까요? [2]
5026농상7/31/201812303소멸자의 이름에 대해서 [2]
5025김기철7/30/20189753selenium 질문좀 드릴개요 [3]
5024농상7/29/20189036패턴 매칭 when에 대해서 질문있습니다. [2]
5023농상7/28/201811993패턴매칭에 대해서 질문 있습니다. [1]
5022농상7/28/20189020튜플에 대해서 건의가 있습니다. [1]
5021농상7/27/20188508예외필터에 대해서 질문이요 [4]
5020농상7/27/201811388null 조건 연산자 예제에서 잠깐 혼동이 일어났습니다. [1]
5019농상7/26/201813691오버플로우와 언더플로우 [2]
... 31  32  [33]  34  35  36  37  38  39  40  41  42  43  44  45  ...