Как динамически составлять список объектов TabPage и получать к ним доступ

#c# #object #tabs #tabcontrol

#c# #объект #вкладки #tabcontrol

Вопрос:

Мне нужно выполнить поиск в моей форме для конкретного объекта TabPage с помощью TabPages.Назовите свойство (или другим способом?) (т.е.Name == «Customer») и верните объект, чтобы я мог передать объект методу.

Я думаю, что есть какой-то класс, у которого есть метод:

 TabPage myTabPage = Objects.type.TabPage("Customer"); 
  

Вкладка была удалена с помощью TabPages.Удалить, и, таким образом, больше не подключен к TabControl
коллекция TabPages, но объект все еще существует. Я хочу использовать TabPages.Вставить, чтобы повторно подключить ТОТ же экземпляр объекта к коллекции, и для этого необходимо передать объект TabPage.

 tabControl1.Tabpages.Insert(tabControl1.TabCount, myTabPage);
  

Есть идеи?

Комментарии:

1. Вкладка была удалена с помощью TabPages. Удалить, и, таким образом, больше не подключен к коллекции TabControl TabPages, но объект все еще существует. Откуда вы это знаете? Если для этого больше нет дескриптора, он должен исчезнуть. Вы должны создать для него дескриптор, прежде чем он будет удален.

2. Хороший вопрос и сохранение ссылки на дескриптор, который я смог сделать.

3. Чтобы ответить на ваш вопрос: после «удаления», делаем Tabpages. IndexOfKey(myTabPage) возвращает значение -1. Однако вставка добавляет вкладку обратно, и я могу видеть все элементы управления (кнопки, метки, текстовые поля) — в одном экземпляре. Когда я делаю прямые TabPages. Добавить (myTabPage) ни один из элементов управления не отображается — другой экземпляр. Я могу сохранить дескрипторы и имя в массиве и выполнить поиск позже. У меня должно было быть более 50 элементов, и я хотел избежать операторов If else. Чистый и быстрый поиск был бы простым.

Ответ №1:

Если вы хотите получить доступ к удаленным объектам, вам необходимо сохранить ссылки на них.

Если вы хотите сохранить ссылки на экземпляры, которые вы создаете динамически, с помощью имени, которое вы им даете, вы можете использовать словарь:

 Dictionary<string, TabPage> myPages = new Dictionary<string, TabPage>();
  

Вы можете добавить их любым из этих способов:

 myPages.Add("Joe", tabControl1.TabPages[0]);
myPages.Add("Jill", tabControl1.TabPages["tabPage2"]);
myPages.Add("Jack", tabPage3);
  

Или вы можете использовать их свойство Name, если оно имеет смысл:

 myPages.Add(tabPage1.Name, tabPage1);
  

И обращаться к ним подобным образом позже:

 tabControl1.TabPages.Add(myPages["Jill"]);
  

Просто убедитесь, что ключи словаря уникальны. Это вызовет ошибку во время выполнения:

 myPages.Add(tabPage1.Name, tabPage1);
tabControl1.TabPages.Remove(tabPage1);
tabControl1.TabPages.Add(new TabPage());
myPages.Add(tabPage1.Name, tabPage1);
  

потому что имя по умолчанию уже есть в словаре. Вы можете использовать метод Contains для проверки как ключей, так и значений:

 if (!myPages.Keys.Contains(tabPage1.Name)) myPages.Add(tabPage1.Name, tabPage1);
if (!myPages.Values.Contains(tabPage1)) myPages.Add(tabPage1.Name, tabPage1);
  

Универсальные коллекции и особенно Dictionary<T,T> они замечательны..

Предупреждение 1: Используя другой ключ, вы все равно можете добавить один и тот же экземпляр дважды.

Предупреждение 2: Поскольку вы сохраняете эти дополнительные ссылки, страница не будет уничтожена, а ее память освобождена до тех пор, пока не исчезнет последняя ссылка.

Комментарии:

1. Спасибо! Я новичок в C # и я не знал о Dictionary. Это большая помощь и упрощает процесс кодирования.