2015-11-30 7 views
0

У меня есть метод, который передается в EnumerableRowCollection (Of System.Data.DataRow), я хочу иметь возможность использовать базовый datatable , В конечном итоге я хочу иметь возможность использовать коллекцию столбцов этого типа данных.из EnumerableRowCollection (Of System.Data.DataRow), присвойте таблице переменной

В настоящее время я использовать

Dim t As System.Data.DataTable = TryCast(x(0), DataRow).Table 

где x is EnumerableRowCollection(Of System.Data.DataRow)

Это работает отлично, за исключением случая, когда количество строк равно нулю.

Я убежден, что основное DataTable определение по-прежнему существует, как я могу получить к нему доступ через отладчик, если я «добавить часы» против х

в окне просмотра я вижу

x|{System.Data.EnumerableRowCollection(of System.Data.DataRow)} 
System.Data.EnumerableRowCollection(of System.Data.DataRow)|{System.Data.EnumerableRowCollection(of System.Data.DataRow)} 
ElementType| {Name="DataRow" FullName = "System.Data.DataRow"} 
EnumerableRows|In-Memory Query 
Table|{mydatatable} 

это mydatatable, что я после

если я попробовать x.Table тогда я получить

'table' не является членом команды 'System.Collections.Generic.IEnumerable (Of System.Data.DataRow)'.

в моем случае EnumerableRowCollection, скорее всего, создается из DataTable с помощью LINQ с OrderBy

Dim z = (From d In mydataset.mydatatable.OrderBy(Function(c) c.myfield)) 

В заключение, я хочу, чтобы иметь возможность получить доступ к DataTable из EnumerableRowCollection (Системы. Data.DataRow), даже если счетчик EnumerableRows равен нулю. Если это невозможно, пожалуйста, не могли бы вы помочь мне объяснить, как это окно может отображать это окно. Могу ли я добавить изображение того, что я вижу в окне часов? Я добавил изображение того, что отладчик показывает, как это получить эту информацию таблицы enter image description here

+0

У меня недостаточно кода для тестирования идей, но как насчет «притворения», вызвав AddRow в пустой коллекции и отразив эту новую строку для ваших столбцов? – Nikki9696

+0

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

+0

Нет, вы не можете получить информацию о таблице из нулевой коллекции. Вам придется передать таблицу через другой параметр. – Steve

ответ

0

Существует не является публичной собственности или метод, который обнажает лежащий в основе DataTable. Недвижимость Table, которую вы видите в собственности internal, которая не является общедоступной. Вы могли копаться в этой детали реализации с помощью отражения:

var pi = rows.GetType().GetProperty("Table",BindingFlags.NonPublic | BindingFlags.Instance); 
DataTable dt = pi.GetValue(rows) as DataTable; 

Но (надеюсь, очевидно) эти внутренние детали реализации являются хрупкими и могут быть изменены.

Поскольку сам класс is not intended to be used directly from your class, я бы предложил изменить свой подход, чтобы принять в качестве параметра вместо этого класса, специфичного для реализации, значение DataTable.

+0

спасибо, я изменил его, чтобы передать в качестве datatable в качестве параметра. Я не понял, что EnumerableRowCollection не работает. Я буду использовать его в краткосрочной перспективе, пока я ищу лучшее решение. – thehill

+0

@thehill Да, к сожалению, тип возврата для метода расширения AsEnumerable возвращает конкретный класс вместо 'IEnumerable '. Таким образом, они могут изменить фактический тип реализации без нарушения существующего кода. –