Уникальный постоянный идентификатор элемента управления

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

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

Таким образом, этот идентификатор должен:

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

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

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


person MajesticRa    schedule 17.09.2011    source источник


Ответы (3)


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

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;
person MajesticRa    schedule 12.09.2012

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

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

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

person Wiktor Zychla    schedule 21.09.2011

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

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();
    }
person Hagelt18    schedule 16.01.2014