2013-04-23 3 views
0

Мне нужна проверка количества x RichTextBox es Я создал динамически нажатием кнопки. Мне нужно убедиться, что до того, как скопировать содержимое в буфер обмена и вызвать следующую форму, нет пустого RTB.Проверить динамически созданные richtextboxes

Я попытался добавить логическую переменную, но это просто пропущено, если пустой RTB находится где-то посередине.

Вот код, который у меня есть. Любая помощь приветствуется.

List<RichTextBox> rtbs = scrlPanel.Children.OfType<RichTextBox>().ToList(); 
List<TextBlock> texts = scrlPanel.Children.OfType<TextBlock>().ToList(); 
StringBuilder raTemplate = new StringBuilder(); 
//bool flag = true; // True as in It is empty 

foreach (RichTextBox rtb in scrlPanel.Children.OfType<RichTextBox>()) 
{ 
    TextRange txtRange = new TextRange(rtb.Document.ContentStart, rtb.Document.ContentEnd); 
    if (txtRange.Text.Trim() == string.Empty) 
    { 
     MessageBox.Show("Empty fields."); 
     break; 
    } 
    else 
    { 
     foreach (TextBlock txtb in texts) 
     { 
      //RichTextBox rtb = rtbs[texts.IndexOf(txtb)]; 
      //TextRange txtRange = new TextRange(rtb.Document.ContentStart, rtb.Document.ContentEnd); 
      raTemplate.Append(txtb.Text + " " + "::" + Environment.NewLine + txtRange.Text.Trim() + Environment.NewLine); 
     } 
     Clipboard.SetText(raTemplate.ToString()); 
     RA_Email ra = new RA_Email(); 
     ra.raEmail(); 
     //flag = true; 
    } 
} 
+0

Если третий RTB пуст, например, вы хотите пропустить остальные или просто пропустить третий? Или вы также хотите отменить первые два? – keyboardP

+0

В значительной степени ваш первый пост (код) исправил мою проблему :), но да, я хочу отбросить все, как только код встретит пустой RTB в начале, посередине или в конце. – hectormtnezg

+0

Я удалил это сообщение, потому что понял, что 'txtRange' не будет существовать вне первого цикла. Отправил обновленную версию, которая должна работать с переменной 'txtRange' :) – keyboardP

ответ

1

Копирование аспект может быть перемещен за пределы цикла, чтобы убедиться, что она начинается только тогда, когда все RichTextBoxes пусты.

bool doCopy = true; 
foreach (RichTextBox rtb in scrlPanel.Children.OfType<RichTextBox>()) 
{ 
    TextRange txtRange = new TextRange(rtb.Document.ContentStart, rtb.Document.ContentEnd); 
    if (txtRange.Text.Trim() == string.Empty) 
    { 
     MessageBox.Show("Empty fields."); 
     doCopy = false; 
     break; 
    } 
} 

if(doCopy) 
{ 
    foreach (TextBlock txtb in texts) 
    { 
     //RichTextBox rtb = rtbs[texts.IndexOf(txtb)]; 
     //TextRange txtRange = new TextRange(rtb.Document.ContentStart, rtb.Document.ContentEnd); 
     raTemplate.Append(txtb.Text + " " + "::" + Environment.NewLine + txtRange.Text.Trim() + Environment.NewLine); 
    } 

    Clipboard.SetText(raTemplate.ToString()); 
    RA_Email ra = new RA_Email(); 
    ra.raEmail(); 
} 
+0

Бьюсь об заклад, вы тоже ее удалите :) Этот последний код, который вы опубликовали, фактически копирует каждый из TextBlock + RTB для каждого RTB в scrlPanel. В принципе, он копирует очень большую добавленную строку. Ваш первый код, однако, работал безупречно, я просто добавил второй txtRange (хотя это не лучшие методы программирования) :) – hectormtnezg

+0

@hectormtnezg - Ах ладно. В этом случае вы можете дважды просмотреть коллекцию RTB. Однажды убедитесь, что ни один из них не пуст, а рядом с ним действительно копируются файлы. (Обновленный ответ. Надеюсь, это сработает!). Если нет, я отправлю первый из них :) – keyboardP

+0

Большое спасибо за вашу помощь keyboardP, я предлагаю вам переустановить первый, хотя я могу отметить его как ответ и до вас, потому что это делает то же самое, что и предыдущее, и txtRange также необходимо повторно объявить. :) – hectormtnezg

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