Отображение форматов расширенных текстовых полей в reportviewer

#c# #wpf #reportviewer

#c# #wpf #reportviewer

Вопрос:

У меня есть форматированное текстовое поле с именем rtb , данные которого вставляются в таблицу SQL следующим образом:

 private void insertdata(object sender, RoutedEventArgs e)
{       
    string name = nameofstudent.Text;
    string father = fatherofstudent.Text;
               
    string id = stud_id.Text;
    string gender;
    if (male.IsChecked == true)
    {
        gender = "M";
    }
    else
        gender = "F";
    
    var richTextBoxContent = new TextRange(this.rtb.Document.ContentStart, this.rtb.Document.ContentEnd);

    string Place = richTextBoxContent.Text;

    connect();
    con.Open();

    string saved = "insert into student_details (Student_ID,Student_Name,Father_Name,Gender,Address)values('" 
      id   "', '"   name   "','"   father   "','"   gender   "','"   Place   "')";
               
    SqlCommand cmd = new SqlCommand(saved, con);
                                    
    cmd.ExecuteNonQuery();
    con.Close();

    MessageBox.Show("record is added");
}
  

чтобы изменить формат форматированного текстового поля, у меня есть кнопка, которая изменит любое выделенное слово на жирный.

 private void changefont(object sender, RoutedEventArgs e)
{
    TextSelection text = rtb.Selection;
    if (!text.IsEmpty)
    {
        text.ApplyPropertyValue(RichTextBox.FontWeightProperty, FontWeights.Bold);
    }
    else
    {
        text.ApplyPropertyValue(RichTextBox.FontWeightProperty, FontWeights.Normal);
    }     
}
  

У меня есть кнопка, которая генерирует отчет в программе просмотра отчетов.

 private void reportviewing(object sender, RoutedEventArgs e)
{
    ReportDataSource reportDataSource = new ReportDataSource();
    connect();
    con.Open();

    SqlDataAdapter adp = new SqlDataAdapter("select * from student_details", con);

    DataTable newtab = new DataTable();
    adp.Fill(newtab);
    reportDataSource.Name = "DataSet1";

    reportDataSource.Value = newtab;
    studentreport.LocalReport.ReportPath = "C:\Users\Alice Luver\Documents\Visual Studio 2012\Projects\STDNT\STDNT\studentsreport.rdlc";

    studentreport.LocalReport.DataSources.Add(reportDataSource);

    studentreport.LocalReport.Refresh();
    studentreport.RefreshReport();
}
  

Это также работает.

Моя проблема в том, что я не могу сохранить форматы.

Например, я хочу сохранить форматированное текстовое поле как: «Привет, я Алиса«

Оно сохраняется и отображается как: «Привет, я Алиса» без жирного шрифта.

Как я могу это решить? Спасибо

Комментарии:

1. Вы также должны сохранить эту метаинформацию. В настоящее время вы извлекаете только обычный текст из RichTextBox и отбрасываете текстовые атрибуты. Информация о том, выделен ли текст жирным шрифтом, хранится в контейнере, TextElement например Run или Span . Либо извлеките полные элементы FlowDocument , либо создайте индекс, который можно использовать для преобразования обычного текста обратно в форматированный текст.

Ответ №1:

Вы можете использовать TextRange.Save и TextRange.Load для сохранения / загрузки форматированного содержимого из FlowDocument . При сохранении содержимого в формате RTF сохраняется информация о форматировании.

 private async Task SaveAndLoadRtfDocumentExampleAsync()
{
  // Select some text
  var textRange = new TextRange(this.RichTextBox.Document.ContentStart, this.RichTextBox.Document.ContentEnd);

  // Convert the FlowDocument selection to a RTF string
  string rtfText;
  using (var outputStream = new MemoryStream())
  {
    textRange.Save(outputStream, DataFormats.Rtf);
    outputStream.Position = 0;
    using (var streamReader = new StreamReader(outputStream))
    {
      rtfText = await streamReader.ReadToEndAsync();
    }
  }

  StoreInDatabase(rtfText);

  rtfText = LoadFromDatabase();

  // Convert the RTF string to a FlowDocument of an existing RichTextBox      
  var newTextRange = new TextRange(this.RichTextBox.Document.ContentStart, this.RichTextBox.Document.ContentEnd);
  using (var inputStream = new MemoryStream(Encoding.UTF8.GetBytes(rtfText)))
  {
    newTextRange.Load(inputStream, DataFormats.Rtf);
  }
}