2009-10-01 92 views
1

我试图重构此代码,因为它是重复的广告nauseum贯穿我的程序。帮助找到最深的儿童控制拼写检查

我的问题有一个事实,即任何给定的网页上(标签页,面板,UC等)有在多个层面控制,以拼写检查做。
即 - >

  foreach (Control control in tpgSystems.Controls) 
      { 
       if (control.GetType() == typeof(MemoExEdit)) 
       { 
        if (control.Text != String.Empty) 
        { 
         control.BackColor = Color.FromArgb(180, 215, 195); 
         control.Text = HUD.Spelling.CheckSpelling(control.Text); 
         control.ResetBackColor(); 
        } 
       } 
      } 
      foreach (Control control in grpCogestiveHeartFailure.Controls) 
      { 
       if (control.GetType() == typeof(MemoExEdit)) 
       { 
        if (control.Text != String.Empty) 
        { 
         control.BackColor = Color.FromArgb(180, 215, 195); 
         control.Text = HUD.Spelling.CheckSpelling(control.Text); 
         control.ResetBackColor(); 
        } 
       } 
      } 
      foreach (Control control in grpDiabetes.Controls) 
      { 
       if (control.GetType() == typeof(MemoExEdit)) 
       { 
        if (control.Text != String.Empty) 
        { 
         control.BackColor = Color.FromArgb(180, 215, 195); 
         control.Text = HUD.Spelling.CheckSpelling(control.Text); 
         control.ResetBackColor(); 
        } 
       } 
      } 

正如你所看到的例子,tpgSystems直接上有一定的控制,然后有两个Group Boxes具有控制在他们。

我在这个目标中的一部分只是检查有可能需要拼写检查的控件,如Text Boxes和那里的亲属。

我知道我可以使用control.HasChildren()但是逃避我的是如何使用它并告诉它有多深。我会假设两个级别是我会去的最深的,但这似乎很短视硬编码,

理想情况下,我会弄清楚如何将控制传递给我的CheckSpelling(),然后在那里有逻辑走多深。可能使用反射

为了完整起见,这里是CheckSpelling()这是在我创建的独立库中。

public string CheckSpelling(string text) 
    { 
     Word.Application app = new Word.Application(); 
     object nullobj = Missing.Value; 
     object template = Missing.Value; 
     object newTemplate = Missing.Value; 
     object documentType = Missing.Value; 
     object visible = false; 
     object optional = Missing.Value; 
     object savechanges = false; 
     app.ShowMe(); 

     Word._Document doc = app.Documents.Add(ref template, ref newTemplate, ref documentType, ref visible); 

     doc.Words.First.InsertBefore(text); 
     Word.ProofreadingErrors errors = doc.SpellingErrors; 

     var ecount = errors.Count; 
     doc.CheckSpelling(ref optional, ref optional, ref optional, ref optional, 
      ref optional, ref optional, ref optional, ref optional, ref optional, 
      ref optional, ref optional, ref optional); 
     object first = 0; 
     object last = doc.Characters.Count - 1; 
     var results = doc.Range(ref first, ref last).Text; 
     doc.Close(ref savechanges, ref nullobj, ref nullobj); 
     app.Quit(ref savechanges, ref nullobj, ref nullobj); 

     return results; 
    } 

回答

2

可以创建一个函数,将“拼写检查”为控制和它的每一个孩子recursivly的...

public void SpellCheckControl(Control control, int depth) 
{ 
    if(depth != 0) 
    { 
     if(Control.HasChildren()) 
     { 
      foreach (Control ctrl in control.Controls) 
      { 
       SpellCheckControl(ctrl, depth - 1); 
      } 
     } 
    } 

    if (control.GetType() == typeof(MemoExEdit)) 
    { 
     if (control.Text != String.Empty) 
     { 
      control.BackColor = Color.FromArgb(180, 215, 195); 
      control.Text = HUD.Spelling.CheckSpelling(control.Text); 
      control.ResetBackColor(); 
     } 
    } 
} 

现在,你可以使用这个功能是这样的:

SpellCheckControl(form1, 2); //form1 is your main form for example 

将应用拼写检查到Form1的孩子的孩子,孩子们Form1的Form1的&(这当然不是一个MemoExEdit,所以不会被选中)。

SpellCheckControl(form1, -1); //form1 is your main form for example 

并且它会将拼写检查应用到form1的任何级别的儿童,只要它可以更深入。

+0

只要我不再需要两个级别以上,这会工作正确吗?如果我在'if(control.HasChildren())'中包装'foreach循环',那么它会更有效率?没有? – 2009-10-01 13:49:14

+0

这将适用于任何你想要的级别(事实上,只要有'小孩',这个功能会下降一步来检查拼写他们和他们的孩子等)。如果(control.HasChildren())更好,则添加。我还将添加一个深度级别来告诉函数停止在。 – manji 2009-10-01 13:56:13

3

我会采取稍微不同的方法。我会创建一个接口,让我们说ISpellCheckable它有一个名为SpellCheck的单一方法。

然后,我会扩展TextBox控件以创建一个新的SpellCheckedTextBox,它实现ISpellCheckable。

然后,用SpellCheckedTextBox(简单更改)替换页面上的相关TextBoxes。

然后,你可以简单地写递归下降通过所有控件的页面上,检查它们是否实现ISpellCheckable一个方法,如果这样调用拼写检查方法,如:

void WalkControls(Control root) 
     { 
      if (root == null) return; 
      foreach (Control control in root.Controls) 
      { 
       if (control is ISpellCheckable) 
       { 
        if (((ISpellCheckable)control).SpellCheck()) 
        { 
         // do stuff 
        } 
       } 
       WalkControls(control); 
      } 
     } 
+0

感谢您用不同的方式来看待这个。我仍然相当绿色,并且还没有实现我自己的界面。你的例子对我来说确实很有意义。 – 2009-10-01 13:54:28

0

您需要使用递归检查控制层 - 做最简单的事情是给定的根控制下检查每一个单一的控制:

public void CheckSpellingRec(IEnumerable<Control> controls) 
{ 
    foreach(var c in controls) 
    { 
     if(c is MemoExEdit && c.Text != String.Empty) 
     { 
      //check spelling 
      control.BackColor = Color.FromArgb(180, 215, 195); 
      control.Text = HUD.Spelling.CheckSpelling(control.Text); 
      control.ResetBackColor(); 
     } 

     //check spelling of child controls 
     CheckSpellingRec(c.Controls.Cast<Control>()); 
    } 
} 

public void CheckSpelling(Control parent) 
{ 
    CheckSpellingRec(new[] { parent }); 
}