2015-08-10 3 views
1

У меня есть несколько элементов управления, которые я пытаюсь связать с запросами LINQ, но я получаю следующее сообщение об ошибке:Связующие элементы управления на запросы LINQ - не могу найти поле

$exception {"DataBinding: 'System.Data.DataRow' does not contain a property with the name 'Key'."} System.Exception {System.Web.HttpException}

Я привязывая его следующим образом:

myDropDownList.DataSource = myDataTable.AsEnumerable().Where(
         r => ((string) r["ColumnName"]) == "ColumnIWant").ToList() 
myDropDownList.DataTextField = "Key"; 
myDropDownList.DataValueField = "Value"; 

Я пробовал это как с .ToList(), так и с другими, но без эффекта.

"myDataTable" имеет обе колонки "Key" и "Value". Это было мое понимание, которое вы могли бы связать таким образом, но мне кажется, что у меня нет указаний на имена свойств.

ответ

0

Использование .CopyToDataTable() работает над тем, что я пытаюсь сделать, но я все же предпочел бы знать, как привязать данные непосредственно к коллекции EnumerableRows, если это возможно.

Вот что я сделал:

myDropDownList.DataSource = myDataTable.AsEnumerable().Where(
         r => ((string) r["ColumnName"]) == "ColumnIWant").CopyToDataTable(); 
myDropDownList.DataTextField = "Key"; 
myDropDownList.DataValueField = "Value"; 
+0

Вы должны отметить правильный ответ. Даже если это твое или чужое. –

+0

Вы не можете пометить свой собственный ответ правильно в течение 2 дней. Ваше решение также не работает. – JWiley

+0

О, теперь я вижу ... Это проверено BTW, но позволяет просто оставить его там. –

0

Если defenitely содержит значения для key и Value в таблице данных, то я предлагаю вам использовать как следующее:

myDropDownList.DataSource = myDataTable.AsEnumerable().Where(
        r => (r.Field<string>("ColumnName")) == "ColumnIWant").ToList<DataRow>(); 
myDropDownList.DataTextField = "Key"; 
myDropDownList.DataValueField = "Value"; 

я изменил ToList() к .ToList<DataRow>(); так, что datasourse может найти key и value так же как и из данных, и изменить сравнение следующим образом: r.Field<string>("ColumnName")

+0

Как это иначе? – JWiley

+0

О, вы не видите в этом никакой разницы? ты пробовал? см. мои обновления –

+0

Не делают ли они оба то же самое? Является ли r ["ColumnName"] не эквивалентным r.Field ("ColumnName")? И .ToList () - это просто избыточный способ вызова .ToList() в коллекции Row. Да, я попробовал, такая же ошибка. – JWiley

1

Мое предложение (так как это сработало для меня таким образом с элементами управления GridView и DropDownList), заключается в том, что вы указываете это DataTextField и DataValueField свойства в файле проекта (ASPX), как это:

<asp:DropDownList ID="DropDownList1" runat="server" 
        DataTextField="Key" DataValueField="Value"> 
</asp:DropDownList> 

Таким образом, вы можете применить функцию ToList() к DataTable, и он будет работать (проверено).

Если это не так, возможно, вам нужно настроить одну точку останова после заполнения myDataTable и еще один после запроса LINQ, чтобы проверить, все ли там столбцы «Key» и «Value».

Смежные вопросы