Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
1 / 1 / 0
Регистрация: 20.06.2017
Сообщений: 34

Как убрать ошибку System.InvalidCastException: Заданное приведение является недопустимым

25.01.2024, 00:03. Показов 3942. Ответов 21

Студворк — интернет-сервис помощи студентам
Уже достаточно много информации в интернете пересмотрел, но так и не понял как сделать то, что мне нужно. Подскажите, пожалуйста, хотя бы где может быть такое искать, или как сформировать запрос, чтобы найти...

На c# wpf приложении мне нужно создать окно с каталогом файлов и папок со структурой, то есть TreeView. Нужно реализовать возможность в этот каталог вносить изменения во время выполнения программы и чтобы по нажатию на надпись происходило открытие файла.

Так как моя программа работает с базой данных my sql на виртуальном сервере, и предполагается, что могут работать несколько копий программы с разных компьютеров, полагаю, что структура каталога файлов должна храниться в базе данных на сервере. Файлы, которые следует открыть, думаю не стоит хранить в базе, а нужно хранить ссылки на файлы.

И вот как здесь увязать всё это, мне не очень понятно: что именно оптимально хранить в таблице, как стоит в таблице хранить информацию об иерархии файлов, как эту иерархию передать в TreeView, как хранить ссылки на файлы и как реализовать возможность добавлять файлы и редактировать структуру дерева, как должно происходить открытие файла...

В общем, буду рад любому совету
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.01.2024, 00:03
Ответы с готовыми решениями:

Заданное приведение является недопустимым
В проге когда создаю школьный класс выдает эту ошибку. Уже несколько дней мучаюсь с этой ошибкой. Могу оплатить тому кто сможет мне...

System.InvalidCastException: "Заданное приведение является недопустимым."
Помогите пожалуйста понять что ему не нравится, я вообще никаких идей не имею что не так. Всегда применял этот способ и всё отлично...

System.InvalidCastException: "Заданное приведение является недопустимым."
Вот так выглядит класс. Вот так выглядит таблица в БД. class Para { public int Id { get; set; } ...

21
1 / 1 / 0
Регистрация: 20.06.2017
Сообщений: 34
26.01.2024, 13:55  [ТС]
1. Есть sql таблица на виртуальном сервере, в которой хранится информация о структуре каталога файлов и папок, которые я позже собираюсь загрузить в treeview (для реализации этой части использую mysql и phpmyadmin)


Насколько мне удалось отыскать информацию в интернете, именно такая структура таблицы подойдёт

2. В c# приложении для хранения информации из таблицы создана структура
C#
1
2
3
4
5
6
7
8
        struct FileSystemItem
        {
            public Int32 id;
            public String name;
            public Int32? parentId;
            public Boolean isFile;
            public String path;
        }
По задумке здесь хранится имя надписи, id родительского элемента, логический флаг - файл ли это, путь к файлу в файловой системе

3. Реализация взаимосвязи
Вот так я собираюсь добавлять элементы в TreeView из списка структуры
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        private void AddChildItems(TreeViewItem parentItem, List<FileSystemItem> fileSystemItems)
        {
            Int32 parentId = (Int32)parentItem.Tag;
            foreach(FileSystemItem item in fileSystemItems)
            {
                if(item.parentId == parentId)
                {
                    TreeViewItem childNode = new TreeViewItem();
                    childNode.Header = item.name;
                    childNode.Tag = item.id;
                    parentItem.Items.Add(childNode);
                    AddChildItems(childNode, fileSystemItems);
                }
            }
        }
Вот так я считываю данные из таблицы и формирую список из структуры
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
        private List<FileSystemItem> GetFileSystemItems()
        {
            List<FileSystemItem> fileSystemItems = new List<FileSystemItem>();
            DB db = new DB();
            DataTable tableCatalog = new DataTable();
            MySqlDataAdapter adapter = new MySqlDataAdapter();
            MySqlCommand command = new MySqlCommand("SELECT * FROM `catalog_info`", db.getConnection());
            adapter.SelectCommand = command;
            adapter.Fill(tableCatalog);
            for (int i = 0; i < tableCatalog.Rows.Count; i++)
            {
                FileSystemItem item = new FileSystemItem();
                item.id = (Int32)tableCatalog.Rows[i]["id"];
                item.name = (String)tableCatalog.Rows[i]["name"];
                item.parentId = (Int32?)tableCatalog.Rows[i]["parent_id"];
                item.isFile = (Boolean)tableCatalog.Rows[i]["is_file"];
                item.path = (String)tableCatalog.Rows[i]["path"];
                fileSystemItems.Add(item);
            }
            return fileSystemItems;
        }
Вот эта функция основная, она инициализирует прорисовку TreeView
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        private void LoadTree()
        {
            List<FileSystemItem> fileSystemItems = GetFileSystemItems();
 
            foreach (FileSystemItem item in fileSystemItems)
            {
                if (item.parentId == null)
                {
                    TreeViewItem rootNode = new TreeViewItem();
                    rootNode.Header = item.name;
                    rootNode.Tag = item.id;
                    treeView.Items.Add(rootNode);
 
                    AddChildItems(rootNode, fileSystemItems);
                }
            }
        }
У меня возникает ошибка при формировании списка List<FileSystemItem> GetFileSystemItems()
C#
1
item.isFile = (Boolean)tableCatalog.Rows[i]["is_file"];
также эта ошибка возникает и в следующем элементе
C#
1
item.path = (String)tableCatalog.Rows[i]["path"];
System.InvalidCastException: "Заданное приведение является недопустимым."


Суть ошибки - в несовместимости типов. Я пробовал много разных способов по транспортировке, но так и не получилось её исправить

В таблице sql данные хранятся в формате "BIT", 0 - ложь, 1 - истинна. Информацию об этом я переношу в объект DataTable, это работает

Далее из объекта DataTable идёт запись в структуру. Элементы id, name и parentId записываются без проблем, а isFile и path вызывает несовместимость данных. Подозреваю, что это связано с тем, что в isFile установлено значение "0", которое интерпретируется как "NULL", в path же у меня сейчас просто ничего не записано, т е значение сразу "NULL", и именно поэтому прога крашится.

Если это действительно так, а может если и не так, а причина в другом, подскажите, пожалуйста, как можно решить эту проблему.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18243 / 14157 / 5366
Регистрация: 17.03.2014
Сообщений: 28,846
Записей в блоге: 1
26.01.2024, 15:54
ydmm, в случае с boolean это говорит о том что за кулисами там другой тип, скорее всего числовой. Попробуйте использовать Convert.ToBoolean.
C#
1
item.isFile = Convert.ToBoolean(tableCatalog.Rows[i]["is_file"]);
С колонкой path другая ситуция. У вас там хранятся null значения. Это нужно учитывать.
C#
1
item.path = tableCatalog.Rows[i]["path"] == DBNull.Value ? null : (String)tableCatalog.Rows[i]["path"];
0
1 / 1 / 0
Регистрация: 20.06.2017
Сообщений: 34
26.01.2024, 19:56  [ТС]
OwenGlendower ,

к сожалению этот вариант тоже не сработал, ошибка по прежнему есть
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18243 / 14157 / 5366
Регистрация: 17.03.2014
Сообщений: 28,846
Записей в блоге: 1
26.01.2024, 20:19
ydmm, какая из двух? Если первая, то попробуйте приводить к числу
C#
1
item.isFile = 1 == Convert.ToInt32(tableCatalog.Rows[i]["is_file"]);
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16117 / 11238 / 2887
Регистрация: 21.04.2018
Сообщений: 33,039
Записей в блоге: 2
26.01.2024, 21:37
Цитата Сообщение от ydmm Посмотреть сообщение
У меня возникает ошибка при формировании списка List<FileSystemItem> GetFileSystemItems()
Что возвращает?
C#
1
Type type = tableCatalog.Rows[i]["is_file"].GetType();
0
1 / 1 / 0
Регистрация: 20.06.2017
Сообщений: 34
27.01.2024, 23:36  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Что возвращает?
Всё ту же ошибку
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16117 / 11238 / 2887
Регистрация: 21.04.2018
Сообщений: 33,039
Записей в блоге: 2
27.01.2024, 23:53
Цитата Сообщение от ydmm Посмотреть сообщение
Всё ту же ошибку
Это уже проблема не в самом значении. Возможно в параметрах.
А так:
C#
1
var tmp = tableCatalog.Rows[i]["is_file"];
0
1 / 1 / 0
Регистрация: 20.06.2017
Сообщений: 34
28.01.2024, 00:08  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Это уже проблема не в самом значении. Возможно в параметрах.
А так:
всё та же ошибка
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16117 / 11238 / 2887
Регистрация: 21.04.2018
Сообщений: 33,039
Записей в блоге: 2
28.01.2024, 00:45
Цитата Сообщение от ydmm Посмотреть сообщение
всё та же ошибка
Тогда только последняя причина - неверный индекс.
Я же верно понимаю?
C#
1
2
var tmp = tableCatalog.Rows[i]["parent_id"]; // Так работает
var tmp1 = tableCatalog.Rows[i]["is_file"]; // А так нет
0
1 / 1 / 0
Регистрация: 20.06.2017
Сообщений: 34
28.01.2024, 05:40  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Тогда только последняя причина - неверный индекс.
Я же верно понимаю?
Верно, но это поле действительно так называется, это первое, что я проверил... посимвольно


Я также пробовал заменить символьное обозначение в индексе на цифру порядкового номена, и обращаться как к [i][j], но проблема всё равно не исчезла
0
1 / 1 / 0
Регистрация: 20.06.2017
Сообщений: 34
28.01.2024, 05:55  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Я же верно понимаю?
Поспешил с ответом... запустил код, чтобы убедиться и в итоге
C#
1
2
var tmp = tableCatalog.Rows[i]["parent_id"]; // Так работает
var tmp1 = tableCatalog.Rows[i]["is_file"]; // А так нет
оба варианта вызывают ошибку
0
 Аватар для xellan24rus
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,173
28.01.2024, 08:07
Цитата Сообщение от ydmm Посмотреть сообщение
Верно, но это поле действительно так называется, это первое, что я проверил... посимвольно
Из ответов выше ясно что проблема в индексе, так как даже не возвращается указанный тип данных в Type.
Из вариантов только, скопируйте is_file название индекса из таблицы, не переписать, а именно скопировать название и вставить его в код. У меня вчера была такая проблема, или символ один не на той раскладке написал, или что то с кодировкой стало произошло я так и не понял. Но переписав свои ключи заново, всё заработало.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16117 / 11238 / 2887
Регистрация: 21.04.2018
Сообщений: 33,039
Записей в блоге: 2
28.01.2024, 11:56
Цитата Сообщение от ydmm Посмотреть сообщение
оба варианта вызывают ошибку
СТОП!

Но вы же выше писали, что строки работаю нормально без исключений:
C#
13
14
15
                item.id = (Int32)tableCatalog.Rows[i]["id"];
                item.name = (String)tableCatalog.Rows[i]["name"];
                item.parentId = (Int32?)tableCatalog.Rows[i]["parent_id"];
В чём разница 15-й строки со строкой var tmp = tableCatalog.Rows[i]["parent_id"]; из моего варианта?
Не может быть чтобы в вашем варианте она работала в моём нет, если нет разницы. Проверьте ещё раз.

Добавлено через 52 секунды
Цитата Сообщение от xellan24rus Посмотреть сообщение
скопируйте is_file название индекса из таблицы, не переписать, а именно скопировать название и вставить его в код.
Там похоже какой-то треш не с этим связанный.
Даже в голову не приходит что это может быть.
0
1 / 1 / 0
Регистрация: 20.06.2017
Сообщений: 34
28.01.2024, 14:05  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Но вы же выше писали, что строки работаю нормально без исключений:
Да, эта часть работает

Как видно из скриншота эта команда работает
C#
1
 item.parentId = (Int32?)tableCatalog.Rows[i]["parent_id"];
А эта уже нет
C#
1
var tmp = tableCatalog.Rows[i]["parent_id"];
Магия не иначе
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16117 / 11238 / 2887
Регистрация: 21.04.2018
Сообщений: 33,039
Записей в блоге: 2
28.01.2024, 14:36
Цитата Сообщение от ydmm Посмотреть сообщение
Как видно из скриншота эта команда работает
Ладно.
Поменяйте в строке:
C#
1
/*item.parentId*/ var parentId = (Int32?)tableCatalog.Rows[i]["parent_id"];
Есть исключение?

Добавлено через 1 минуту
Так же проверьте какие колонки с какими индексами есть в таблице после выполнения adapter.Fill(tableCatalog);.

Добавлено через 4 минуты
Внутри цикла получите массив значений и проверьте что есть в нём:
C#
1
 var cells = tableCatalog.Rows[i].ItemArray;
Добавлено через 2 минуты
Цитата Сообщение от Элд Хасп Посмотреть сообщение
какие колонки с какими индексами есть в таблице
C#
1
var names = tableCatalog.Columns.Select(col => col.ColumnName).ToArray();
Добавлено через 12 минут
ydmm, было бы проще, если бы с гита клонировать и попробовать у себя на компе.
Но боюсь у вас серверная БД и потребуется настраивать её так же как у вас.
Вот если переведёте на SQLite (для отладки), то можно будет так сделать.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18243 / 14157 / 5366
Регистрация: 17.03.2014
Сообщений: 28,846
Записей в блоге: 1
28.01.2024, 15:05
Цитата Сообщение от ydmm Посмотреть сообщение
Как видно из скриншота эта команда работает
C#
1
item.parentId = (Int32?)tableCatalog.Rows[i]["parent_id"];
А эта уже нет
C#
1
var tmp = tableCatalog.Rows[i]["parent_id"];
Магия не иначе
Мне кажется что отладчик подсвечивает не ту строку. Попробуйте пошагово пройти по строкам внутри цикла начиная с первой строки после вызова конструктора (там можно точку останову поставить). Или - другой вариант - закоментируйте все строки с tableCatalog.Rows[i] и убирайте комментарий по одной.
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16117 / 11238 / 2887
Регистрация: 21.04.2018
Сообщений: 33,039
Записей в блоге: 2
28.01.2024, 16:26
ydmm, у вас Debug или Release сборка?
0
 Аватар для xellan24rus
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,173
28.01.2024, 16:48
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Там похоже какой-то треш не с этим связанный.
Даже в голову не приходит что это может быть.
Так как это бд, может миграция старая, а в модели что то обновил и при чтение бд теперь какая то беда с типами при чтении.
Без самого проекта сложно понять что является ошибкой. Даже идей нет как такую ошибку повторить.
Один из возможных вариантов для автора сделать новую миграцию для таблицы, может быть сработает.
1
1 / 1 / 0
Регистрация: 20.06.2017
Сообщений: 34
29.01.2024, 12:56  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
ydmm, было бы проще, если бы с гита клонировать и попробовать у себя на компе.
Но боюсь у вас серверная БД и потребуется настраивать её так же как у вас.
Вот если переведёте на SQLite (для отладки), то можно будет так сделать.
Цитата Сообщение от xellan24rus Посмотреть сообщение
Так как это бд, может миграция старая, а в модели что то обновил и при чтение бд теперь какая то беда с типами при чтении.
Без самого проекта сложно понять что является ошибкой. Даже идей нет как такую ошибку повторить.
Один из возможных вариантов для автора сделать новую миграцию для таблицы, может быть сработает.

Всем спасибо за помощь, проблема была в
C#
1
item.parentId = (Int32?)tableCatalog.Rows[i]["parent_id"];
Здесь
C#
1
public Int32? parentId;
предполагалась возможность хранить NULL. Но заменив все значения NULL на 0, удалось устранить ошибку.
Теперь правда структура treeview не прогружается и не повторяет структуру, описанную в таблице, но это уже другая проблема, которую сейчас буду дальше решать

Добавлено через 23 минуты
Вопрос работоспособности также решён, нужно было заменить NULL на 0 в строке
C#
1
if (item.parentId == 0)
в методе LoadTree()
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.01.2024, 12:56
Помогаю со студенческими работами здесь

System.InvalidCastException: "Заданное приведение является недопустимым."
Нажимаю на строчку в таблице - выдает эту ошибку (System.InvalidCastException: &quot;Заданное приведение является недопустимым.&quot;). ошибка...

System.InvalidCastException: "Заданное приведение является недопустимым."
Пытаюсь сохранить данные в sql итоги ошибка System.InvalidCastException: &quot;Заданное приведение является недопустимым.&quot; Ошибка...

System.InvalidCastException: "Заданное приведение является недопустимым."
var data = _service.GetCountNumber(id); var countNumber = (int)data.Rows; // System.InvalidCastException: &quot;Заданное приведение является...

System.InvalidCastException: "Заданное приведение является недопустимым."
Добрый день , нужно строку конвертировать в математическое действие , нашел такой способ: float result_math = (float)new...

System.InvalidCastException: "Заданное приведение является недопустимым."
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru