我正在创建一个聊天应用程序,我想在粗体中显示名称。首次加载表单时,我使用这些代码行在RichTextBox
控件上显示数据库中的历史记录对话,我想以粗体显示名称:
以下是使这成为可能的所有代码:
string strProvider = "Data Source=" + srv_host + ";Database=" + srv_db + ";User ID=" + srv_user + ";Password=" + srv_pass;
MySqlConnection myConn = new MySqlConnection(strProvider);
try
{
myConn.Open();
string strCmd = "SELECT * FROM comments WHERE task_id=@task_id AND ((from_usr=@from AND to_usr=@to) OR (from_usr=@to AND to_usr=@from)) ORDER BY at_time ASC";
MySqlCommand myCmd = new MySqlCommand(strCmd, myConn);
myCmd.Parameters.AddWithValue("from", frm_usr);
myCmd.Parameters.AddWithValue("to", to_usr);
myCmd.Parameters.AddWithValue("task_id", tid);
myCmd.ExecuteNonQuery(); // execute now
MySqlDataReader dr = myCmd.ExecuteReader();
while (dr.Read())
{
string text = dr.GetValue(1).ToString() + ": " + dr.GetValue(6) + Environment.NewLine;
richTextBox1.AppendText(text);
richTextBox1.SelectionStart = 0;
richTextBox1.SelectionLength = dr.GetValue(1).ToString().Length;
richTextBox1.SelectionFont = new Font(richTextBox1.Font,FontStyle.Bold);
}
myConn.Dispose();
}
catch (Exception E) { MessageBox.Show(E.Message); }
这些代码行无法按预期工作:
while (dr.Read())
{
string text = dr.GetValue(1).ToString() + ": " + dr.GetValue(6) + Environment.NewLine;
richTextBox1.AppendText(text);
richTextBox1.SelectionStart = 0;
richTextBox1.SelectionLength = dr.GetValue(1).ToString().Length;
richTextBox1.SelectionFont = new Font(richTextBox1.Font,FontStyle.Bold);
}
修改
dr.GetValue(1).ToString()
保留用户的全名
dr.GetValue(6).ToString()
保留信息
上面代码的问题是它只显示Bold中的第一个名称,但其他行不受影响。查看图片
有人可以告诉我代码无效的原因。我无法弄清楚错误在哪里。
谢谢你
答案 0 :(得分:5)
您遇到的问题是richTextBox1.SelectionStart
始终为零,这意味着格式化只会应用于文本框中的第一行。
尝试将其设置为richTextBox1.SelectionStart = richTextBox1.TextLength
。
修改强>
尝试将其设置为
richTextBox1.SelectionStart = richTextBox1.TextLength - text.Length;
编辑2:
我认为无效参数是由使用Environment.NewLine
引起的。如果我使用"\n"
,代码工作正常。问题是Windows Environment.NewLine
当然是\r\n
,但richtextBox1
似乎忽略了\r
。这导致richTextBox1.TextLength - text.Length
在第一次迭代中为-1。
答案 1 :(得分:0)
我无法测试,但可能是因为SelectionStart
索引始终为0,请尝试将其设置为刚刚添加的行的开头
while (dr.Read())
{
string text = dr.GetValue(1).ToString() + ": " + dr.GetValue(6) + Environment.NewLine;
richTextBox1.AppendText(text);
richTextBox1.SelectionStart = richTextBox1.GetFirstCharIndexOfCurrentLine();
richTextBox1.SelectionLength = dr.GetValue(1).ToString().Length;
richTextBox1.SelectionFont = new Font(richTextBox1.Font,FontStyle.Bold);
}