【问题标题】:Validate dynamically created richtextboxes验证动态创建的富文本框
【发布时间】:2023-04-02 20:10:01
【问题描述】:

我需要验证我在按下按钮时动态创建的 x 个 RichTextBoxes。在将内容复制到剪贴板并调用下一个表单之前,我需要确保没有一个 RTB 为空。

我尝试添加一个布尔变量,但如果中间某处有一个空 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;
    }
}

【问题讨论】:

  • 如果第三个 RTB 为空,例如,您要跳过其余部分还是只跳过第三个?还是您也想撤消前两个?
  • 您的第一篇文章(代码)几乎解决了我的问题 :) 但是是的,我想在代码遇到空 RTB 时立即丢弃所有内容,无论是在开始时、中间还是在结束。
  • 我删除了那个帖子,因为我意识到txtRange 在第一个循环之外不会存在。重新发布了应该与 txtRange 变量一起使用的更新版本:)

标签: c# wpf richtextbox validating


【解决方案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();
}

【讨论】:

  • 我打赌你也会删除这个 :) 你发布的这个最新代码实际上为 scrlPanel 中的每个 RTB 复制了每个 TextBlock + RTB。基本上,它复制了一个非常大的附加字符串。但是,您的第一个代码完美无缺,我只是添加了第二个 txtRange (尽管它不是最佳编程实践):)
  • @hectormtnezg - 好吧。在这种情况下,您可以循环两次 RTB 集合。一次是为了确保没有一个是空的,接下来是实际做复制的东西。 (更新的答案。希望它有效!)。如果没有,我会重新发布第一个:)
  • 非常感谢您的帮助keyboardP,我建议您重新发布第一个,以便我可以将其标记为答案并给您加分,因为这个与上一个做的事情相同一个并且txtRange也需要重新声明。 :)
  • 不客气!如果我没记错的话,这是第一个建议:D
猜你喜欢
  • 1970-01-01
  • 2011-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多