Уникальный постоянный идентификатор управления - PullRequest
5 голосов
/ 17 сентября 2011

Что у нас есть
У нас есть несколько сложных элементов управления winforms.Для хранения его состояния мы используем некоторый пользовательский сериализованный класс.Допустим, мы сериализовали его в XML.Теперь мы можем сохранить этот XML-файл как файл в каталоге пользователя или включить его в какой-то другой файл ....
Но ...

Вопрос: ,
если пользователь создает несколько таких элементов управления в своем приложении winform (во время разработки), какой уникальный идентификатор лучше использовать, чтобы узнать, какой из сохраненных конфигураций принадлежит какому из этих элементов управления?

Итак, этот идентификатор должен:

  • Оставайтесь неизменными при каждом запуске приложения
  • Автоматически задано (или уже задано, как мы можем предположить, что Control.Name всегда там)
  • Уникально в приложении

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

Что лучше использовать?Почему?

Ответы [ 3 ]

2 голосов
/ 13 сентября 2012

Этот небольшой метод расширения работает:

public static class FormGetUniqueNameExtention
{
    public static string GetFullName(this Control control)
    {
        if(control.Parent == null) return control.Name;
        return control.Parent.GetFullName() + "." + control.Name;
    }
}

Возвращает что-то вроде 'Form1._flowLayoutPanel.label1'

Использование:

Control aaa;
Dictionary<string, ControlConfigs> configs;
...
configs[aaa.GetFullName()] = uniqueAaaConfig;
1 голос
/ 16 января 2014

Это метод, который я в итоге создал, чтобы определить уникальное имя, которое включает полное имя формы (с его пространством имен), а затем каждый родительский элемент управления выше рассматриваемого элемента управления.Таким образом, это может выглядеть примерно так:

MyCompany.Inventory.SomeForm1.SomeUserControl1.SomeGroupBox1.someTextBox1

    static string GetUniqueName(Control c)
    {
        StringBuilder UniqueName = new StringBuilder();
        UniqueName.Append(c.Name);
        Form OwnerForm = c.FindForm();

        //Start with the controls immediate parent;
        Control Parent = c.Parent;
        while (Parent != null)
        {
            if (Parent != OwnerForm)
            {
                //Insert the parent control name to the beginning of the unique name
                UniqueName.Insert(0, Parent.Name + "."); 
            }
            else
            {
                //Insert the form name along with it's namespace to the beginning of the unique name
                UniqueName.Insert(0, OwnerForm.GetType() + "."); 
            }

            //Advance to the next parent level.
            Parent = Parent.Parent;
        }

        return UniqueName.ToString();
    }
1 голос
/ 21 сентября 2011

Я использовал составной идентификатор, составленный из полного дерева иерархии управления.Предполагая, что ваше имя формы - Form1, у вас есть групповой блок Groupbox1 и текстовое поле TextBox1, составной идентификатор будет Form1 / Groupbox1 / TextBox1.

Если вы хотите следовать этому, вот подробности:

http://netpl.blogspot.com/2007/07/context-help-made-easy-revisited.html

...