Я пытаюсь отредактировать этот код, поскольку он повторяется ad nauseum на протяжении всей моей программы.Помогите найти самый глубокий контроль над детьми для проверки орфографии
Моя проблема связана с тем, что на любой странице (TabPage, панель, УНЦ и т.д.) есть элементы управления на различных уровнях для проверки орфографии.
т.е. ->
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;
}
Это будет работать до тех пор, пока мне не нужно идти больше двух уровней, правильно? Если я закрою 'foreach loop' в' if (control.HasChildren()), то это будет более эффективно ???? Нет? –
это будет работать на любом уровне, который вы хотите (на самом деле, пока есть «дети», эта функция будет идти на один шаг вниз, чтобы проверить заклинание их и их детей и т. Д.). Добавление if (control.HasChildren()) лучше. Я также добавлю уровень глубины, чтобы остановить функцию. – manji