2012-03-22 252 views
0

我有一个非常讨厌的问题: 我正在C#中的协作文本编辑器工作,我想从列表中的每个客户端编辑共享的文本框,但我被困在来自键盘转换的字符。 下面是keydown事件代码:协作文本编辑器

private void downKey(object sender, KeyEventArgs e) 
    { 
     try 
     { 
      byte[] data; 

      switch (e.KeyCode) 
      { 
       case Keys.Enter: data = Encoding.UTF8.GetBytes("enter"); 
        break; 
       case Keys.Back: data = Encoding.UTF8.GetBytes("backspace"); 
        break; 
       case Keys.Space: data = Encoding.UTF8.GetBytes("space"); 
        break; 
       default: 


         data = Encoding.UTF8.GetBytes(e.KeyCode.ToString().ToLower()); 


        break; 
      } 

      TcpClient.GetStream().Write(data, 0, data.Length); 

     } 
     catch (SocketException se) 
     { 
      MessageBox.Show(se.Message); 
     } 
    } 

现在从连接到应用程序的客户端列表中的每个客户端应接收与textBox.So对everyclient的“OnDataReceived”回调输入字节数组将此字节数组转换为字符串并尝试通过crossThreadDelegate更新每个客户端的文本框。

public void OnDataReceived(IAsyncResult asyn) 
    { 
     try 
     { 
      TcpSpecificPacket theSockId = (TcpSpecificPacket)asyn.AsyncState; 
      int dataReceivedLength = theSockId.thisClient.GetStream().EndRead(asyn); 
      if (dataReceivedLength != 0) 
      { 
       textBoxArrived.Invoke(changeCrossTextBox, new object[] {Encoding.UTF8.GetString(theSockId.dataBuffer, 0, dataReceivedLength)}); 

       WaitForData(); 
      } 
     } 
     catch (IOException) 
     { 

     } 

而现在的crossThread委托的定义:

private void changeCrossTextBox(string mesaj) 
    { 

     if (mesaj.Equals("enter")) 
     { 
      textBoxArrived.Text += Environment.NewLine; 
     } 
     else if (mesaj.Equals("space")) 
     { 
      textBoxArrived.Text += " "; 

     } 
     else if (mesaj.Equals("backspace")) 
     { 
      textBoxArrived.Text = textBoxArrived.Text.Substring(0, textBoxArrived.Text.Length - 1); 
     } 
     else 
     { 
      textBoxArrived.Text += mesaj; 
     } 
    } 

但我真正的问题是未来:我不能确定井的转义字符,因为我发送一个字节数组,我将其转换为字符串,然后我尝试用该字符串更新每个客户端的文本框。例如,当我按shift键时,客户端的所有文本框中的字符串都将是“shiftKey”。请告诉我如何处理这些转义字符?是否有一种方法可以用ASCII发送和更新。

回答

0

我不是100%确定你的问题在问什么 - 但是如果你想过滤一个字符串来包含非控制字符,你可以使用这个 - 如果你改变你的代码来使用OnKeyPress事件,而不是OnKeyDown

if(!char.IsControl(e.KeyChar)) 
{ 
    //Do Stuffz 
} 

有很多的东西到“字符”对象,你可以使用测试键码。

char.IsLetterOrDigit, char.IsPunctuation ..等

+0

谢谢! – 2012-03-22 21:18:46