Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
3 / 3 / 0
Регистрация: 31.10.2014
Сообщений: 39
1

Необходимо получить тип элемента и с помощью CType или DirectCast изменить его тип

11.02.2015, 11:44. Показов 2168. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет!
Подскажите, пожалуйста, есть ли вариант решения данной проблемы:
Необходимо получить тип элемента и с помощью CType или DirectCast изменить тип данного элемента
Пример:
Допустим, у меня на форме есть два элемента ListBox и ComboBox, у обоих этих элементов есть свойство DataSource
И чтобы не плодить функции - хочу одним выстрелом убить двух зайцев следующим образом:

VB.NET
1
2
3
4
5
6
7
8
9
10
Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
        ChangeBox(Me.ListBox1)
    End Sub
 
    Sub ChangeBox(Box As Object)
        Dim ElType = Box.GetType
        CType(Box, ElType).DataSource = {1, 2, 3, 4}
    End Sub
End Class
Для меня как бы всё логично, ElType имеет тип System.Type и должно всё работать
Но, к сожалению, получаю ошибку - Тип "ElType" не определен (?)

Можно, конечно, сделать проще:

VB.NET
1
2
3
    Sub ChangeBox(Box As Object)
        Box.datasource = {1, 2, 3, 4}
    End Sub
Но у меня включен Option Strict, а он не позволяет позднее связывание

Заранее благодарен!
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.02.2015, 11:44
Ответы с готовыми решениями:

Как удалить файл или изменить его тип
Всем привет! Подскажите мне пожалуйста как удалить в с++; То есть допустим пользователь указал...

Дано описание массива, у которого индексы имеют перечислимый тип, а тип элемента – integer или real. Выведите на экран,
Дано описание массива, у которого индексы имеют перечислимый тип, а тип элемента – integer или...

Дано описание массива, у которого индексы имеют ограниченный тип над integer, а тип элемента – integer или real
Дано описание массива, у которого индексы имеют ограниченный тип над integer, а тип элемента –...

Хочу изменить тип "int" в тип "float". Но как его меняю, то появляется ошибка как её можно исправить?
public class Ball { PongForm form; private PictureBox ballPictureBox,...

4
COM‐пропагандист
859 / 768 / 147
Регистрация: 18.12.2014
Сообщений: 2,195
Записей в блоге: 4
11.02.2015, 12:04 2
Box объявлен как Object, поэтому GetType возвращает тип Object, а не ElType. Седьмая строка не нужна.
0
3 / 3 / 0
Регистрация: 31.10.2014
Сообщений: 39
11.02.2015, 12:11  [ТС] 3
Замабувараев, спасибо за отклик
Но GetType возвращает ListBox - {Name = "ListBox" FullName = "System.Windows.Forms.ListBox"} System.Type
0
Администратор
Эксперт .NET
17019 / 13372 / 5217
Регистрация: 17.03.2014
Сообщений: 27,344
Записей в блоге: 1
11.02.2015, 12:18 4
Лучший ответ Сообщение было отмечено LightZ как решение

Решение

LightZ, без позднего связывания универсальный код не получится написать. Если бы Microsoft сделала бы интерфейс для всех элементов управления с DataSource, то тогда бы приводили к интерфейсу и проблемы не было бы. Можно решить примерно так:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
Sub ChangeBox(Box As Control)
    Dim lb As ListBox = TryCast(Box, ListBox)
    If lb IsNot Nothing Then
        lb.DataSource = {1, 2, 3, 4}
    End If
    
    Dim cb As ComboBox = TryCast(Box, ComboBox)
    If cb IsNot Nothing Then
        cb.DataSource = {1, 2, 3, 4}
    End If
End Sub
Цитата Сообщение от LightZ Посмотреть сообщение
Для меня как бы всё логично, ElType имеет тип System.Type и должно всё работать
Но, к сожалению, получаю ошибку - Тип "ElType" не определен (?)
CType ожидает имя типа, а ты передаешь переменную типа Type. Это не одно и тоже. Кроме того, а как компилятор должен обрабатывать этот код? Ты ему передаешь значение которое станет известно только на этапе исполнения и он не в состоянии проверить это выражение. По сути это получается позднее связывание, а это VB.NET умеет делать и без таких конструкций
1
3 / 3 / 0
Регистрация: 31.10.2014
Сообщений: 39
11.02.2015, 12:23  [ТС] 5
OwenGlendower, спасибо!
Всё понял, действительно путаница вышла
До создания этой темы, у меня в проекте чуть другой вариант, и в принципе, он меня устраивает:
VB.NET
1
2
3
4
5
6
    Overloads Sub ChangeBox(Box As ListBox)
        Box.DataSource = {1, 2, 3, 4}
    End Sub
    Overloads Sub ChangeBox(Box As ComboBox)
        Box.DataSource = {1, 2, 3, 4}
    End Sub
Но спасибо за разъяснение, очень благодарен!
0
11.02.2015, 12:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.02.2015, 12:23
Помогаю со студенческими работами здесь

Передать простой тип по ссылке и изменить его
Доброго времени суток. По воле провидения понадобилось писать софт на Java под андроид, хотя я в...

Как изменить тип элемента в форме с текстбокса на комбобокс
Решил убрать поля с подстановкой, в таблицах. При создании новой формы, вместо привычных готовых...

В запросе LINQ to Entities нельзя конструировать тип сущности или сложный тип
Необработанное исключение типа "System.NotSupportedException" в EntityFramework.SqlServer.dll ...

Рефлексия. Получить тип элемента массива
Добрый день. Необходимо получить тип элемента массива, для сравнения с существующим типом....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru