代码如下        //发送表情
        private void btnOK_Click(object sender, EventArgs e)
        {
            byte[] biStr = System.Text.Encoding.Unicode.GetBytes(rtbOut.Rtf);
            string s = System.Text.Encoding.Unicode.GetString(biStr, 0, biStr.Length);
            string sql = "insert rrr(Chat) values (@biStr)";
            SqlCommand comm = new SqlCommand(sql, DBHelper.conn);
            comm.Parameters.AddWithValue("@biStr", s);//ms.GetBuffer()
            DBHelper.conn.Open();
            int num = comm.ExecuteNonQuery();
            DBHelper.conn.Close();
            if (num == 1)
            {
                trmIn.Start();
            }
        }        //接受数据库的信息
        private void trmIn_Tick(object sender, EventArgs e)
        {            rtbOut.Clear();
            string sql = "select Chat from rrr";
            SqlCommand comm = new SqlCommand(sql, DBHelper.conn);
            DBHelper.conn.Open();            //下面是读取 
            SqlDataReader reader = comm.ExecuteReader();
            while (reader.Read())
            {
                //循环插入
                rtbIn.SelectionStart = rtbIn.TextLength;
                rtbTemp.Rtf = reader[0].ToString();
            }
            reader.Close();
            DBHelper.conn.Close();
            trmIn.Stop();
        }

解决方案 »

  1.   

    richtext1.text += stringappend;
      

  2.   

    this.richTextBox1.AppendText("XX");
    注意光标位置
      

  3.   

    AppendText只能是字符串,我把rtf放进去,就以字符串的形式输出了
      

  4.   

    现在实现的,只是我自己发送上去的数据,可是如果别人也说话的话,我就读取不了了,代码如下:        int iden = 0;//用来接收标识列,以便接受数据
            private void picR_Click(object sender, EventArgs e)//点击图片黏贴到发送消息框
            {
                //剪切板放入数据
                Clipboard.SetDataObject(picR.Image, false);
                //保存剪切板数据 
                IDataObject data = Clipboard.GetDataObject();
                //验证是否可以转换成位图 
                if (data.GetDataPresent(DataFormats.Bitmap))
                {
                    //转换位图 
                    Bitmap b = (Bitmap)data.GetData(DataFormats.Bitmap);
                    //设置剪切板为转换后的位图 
                    Clipboard.SetDataObject(b);
                    rtbOut.Paste();
                }
                rtbOut.Focus();
            } //发送表情
            private void btnOK_Click(object sender, EventArgs e)
            {
                //把当前的richtextbox内容包括图片和文本保存
                byte[] biStr = System.Text.Encoding.Unicode.GetBytes(rtbOut.Rtf);//SaveFile(ms, RichTextBoxStreamType.RichText);
                string s = System.Text.Encoding.Unicode.GetString(biStr, 0, biStr.Length);
                //保存二进制使用的参数
                string sql = "insert rrr(Chat) values (@biStr)";
                SqlCommand comm = new SqlCommand(sql, DBHelper.conn);
                comm.Parameters.AddWithValue("@biStr", s);//ms.GetBuffer()
                DBHelper.conn.Open();
                int num = comm.ExecuteNonQuery();
                sql = "select @@identity from rrr";
                iden = 0;
                comm.CommandText = sql;
                iden = Convert.ToInt16(comm.ExecuteScalar());
                DBHelper.conn.Close();
                if (num == 1)
                {
                    trmIn.Start();
                }
            }        //接受数据库的信息
            private void trmIn_Tick(object sender, EventArgs e)
            {            rtbOut.Clear();
                string sql = string.Format("select Chat from rrr where Id = {0}", iden);
                SqlCommand comm = new SqlCommand(sql, DBHelper.conn);
                DBHelper.conn.Open();
                //下面是读取
                rtbIn.Select(rtbIn.TextLength, 0);
                rtbIn.SelectedRtf = comm.ExecuteScalar().ToString();
                DBHelper.conn.Close();
                trmIn.Stop();
            }
      

  5.   

    这个跟二进制流没什么关系,我认为关键还在于RTF格式的问题。
    不用二进制流也不是什么大问题,只是我总觉得它效率高些。我开始查看RichTextBox的方法的时候有个想法:不断地把RichTextBox上的当前内容使用Cut方法剪切到剪贴板上,然后增加新数据了,又把这些内容粘贴回来。
    只是,我还没有想好,如何控制粘贴的位置。
      

  6.   

    要不,使用一个隐形的RichTextBox,用于不断地从流中加载内容,然后这边就剪切,那边用于显示的就不断地粘贴。
      

  7.   

    使用一个临时的rich放置读取出来的数据,然后使用selectedRtf整合显示的rich,是这样的吧?要不您帮我把你的想法写成代码吧,这样我看起来更直观一点
      

  8.   

    刚我在网上搜索到有人说,richtextbox有加强版的?可以AppendRtf?
      

  9.   


           //接受数据库的信息
            private void trmIn_Tick(object sender, EventArgs e)
            {
                rtbOut.Clear();
                string sql = "select Chat from rrr where Id <> 0";
                SqlCommand comm = new SqlCommand(sql, DBHelper.conn);
                DBHelper.conn.Open();
                //下面是读取 
                byte[] b = null;
                SqlDataReader reader=comm.ExecuteReader();
                MemoryStream ms = new MemoryStream();
                RichTextBox rchTemp=new RichTextBox();
                rchTemp.Visible=false;
                ms.Position = 0;//这一句实在是多余的,流的起始位置本来就在0。
                while(reader.Read())
                {
                b = (byte[])(reader[0]);
                ms.Write(b, ms.Position, b.Length);
                //ms.Seek(Position,b.Length);//加这一句看看
                  rchTemp.LoadFile(ms,RichTextBoxStreamType.RichText);
                rchTemp.SelectAll();
                rchTemp.Cut();
                rtbIn.Paste();//就不知道粘贴后它的插入点会不会自己移到末尾去
                 ms.Position = 0;
                }
                //ms.Position=0;//这一句也不知道要不要,可以试试去掉看看
                //rtbIn.LoadFile(ms, );
                ms.Close();
                rchTemp.Dispose();            DBHelper.conn.Close();
                trmIn.Stop();
    }
    我真是闲的...