2016-01-16 3 views
1

У меня здесь немного странная проблема. Я пытаюсь создать форму, которая при создании выделения из ListBox будет опросить данные из базы данных и отобразить их в RichTextBox. Мне нужны данные для RTF для форматирования.RichTextBox.RTF не принимает строку, созданную из базы данных - C#

Он отлично работает, если я что-то вроде этого:

private void SaveListTest_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     DescriptionName = Convert.ToString(SaveListTest.SelectedItem); 
     //CallDescriptionTest(); 
     CallDescriptionTest2(); 
     SaveRichTest.Rtf = DescriptionText; 
    } 

    public void CallDescriptionTest2() 
    { 
     switch (DescriptionName) 
     { 
      case "Test": 
       DescriptionText = @"{\rtf1\ansi\ Test}"; 
       break; 
      case "Words": 
       DescriptionText = @"{\rtf1\ansi\ A really long phrase}"; 
       break; 
     } 
    } 

В таком случае RichTextBox (SaveRichTest) будет принимать данные и отображать это просто отлично.

Однако, если я что-то вроде этого, где описание столбца в базе данных есть текст, введенный в точности, как указано выше (экс - @ "{\ rtf1 \ ANSI \ Test}"):

private void SaveListTest_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     DescriptionName = Convert.ToString(SaveListTest.SelectedItem); 
     CallDescriptionTest(); 
     //CallDescriptionTest2(); 
     SaveRichTest.Rtf = DescriptionText; 
    } 

    public void CallDescriptionTest() 
    { 
     using (SqlConnection con = new SqlConnection(BuildDB)) 
     { 
      con.Open(); 
      string sql = String.Format("Select * from Abilities where Name = '{0}'", DescriptionName); 
      SqlCommand oCmd = new SqlCommand(sql, con); 

      using (SqlDataReader oReader = oCmd.ExecuteReader()) 
      { 
       while (oReader.Read()) 
       { 
        DescriptionText = Convert.ToString(oReader["Description"]); 
       } 
       con.Close(); 
      } 
     } 
    } 

Это приведет к сбою программы с ошибкой, что «Формат файла недействителен».

Я знаю, что текст извлекается из базы данных правильно, потому что если я изменил «SaveRichTest.Rtf» на «SaveRichTest.Text», он отобразит его правильно (хотя и с кодом отображения RTF).

Я просто не могу понять, почему он не будет правильно брать строку во втором случае. Для меня это не имеет никакого смысла. Может кто-нибудь помочь?

+0

Просто nit: вызов con.Close() не требуется, поскольку он закрывается, когда соединение установлено. –

+0

Да, каждый раз, когда я видел учебник, они всегда делали con.Close() после того, как они закончили чтение из базы данных, поэтому я предположил, что это необходимо. –

+1

Называть Close() не очень больно, но завершение соединения в используемом блоке вызывает Dispose() автоматически, который сам закроет соединение. –

ответ

0

Я думаю, в случае, когда вы пытались показать свой вывод в виде обычного текста, на выходе был: @"{\rtf1\ansi\ Test}

Это означало бы, когда вы хотите, чтобы показать эту строку, отформатированную непосредственно из базы данных вы бы передать его "@"{\rtf1\ansi\ Test}"" вместо правильный формат. Я предлагаю вам сохранить формат без @ в базе данных и просто показать результат.

+0

Я попытался добавить «@» как часть процесса oRead, но это ничего не помогло. Кавычки были также неповрежденными, когда строка отображалась как обычный текст, поэтому я не думаю, что добавление второй набор цитат поможет, но я дам ему шанс. –

+0

Изменен режим «while» (oReader.Read()) { ОписаниеText = "@" + Convert.ToString (oReader ["Описание"]); } ", а также добавление двойных кавычек к каждой записи в базы данных. Еще ничего хорошего, но спасибо за предложение. –

+0

О, как я был тупой. Вам даже не нужно, чтобы @ в первую очередь. Это нужно было только для того, чтобы избежать \ в вашем первом примере, но не понадобится, если вы получите строку непосредственно из db –

Смежные вопросы