协作文本编辑器

时间:2012-03-22 12:11:36

标签: c# collaborative-editing

我有一个非常讨厌的问题: 我正在使用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的输入的字节数组。在每个客户端的“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;
        }
    }

但我真正的问题是下一个:我无法识别转义字符,因为我发送了一个字节数组,我将其转换为字符串,然后我尝试用该字符串更新每个客户端的textBox。例如,当我按下shift键时,客户端的所有TextBox中的字符串将是“shiftKey”。您能告诉我如何处理这些转义字符吗?是否有以ASCII格式发送和更新的方法。

1 个答案:

答案 0 :(得分:0)

我不是100%确定您的问题是什么 - 但如果您希望过滤字符串以包含非控制字符,则可以使用此 - 如果您更改代码以使用OnKeyPress事件而不是OnKeyDown

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

有很多东西可以测试你可以使用的'char'对象上的密钥代码。

char.IsLetterOrDigit, char.IsPunctuation ..等等