Привязка DataSet к GridView - PullRequest
       9

Привязка DataSet к GridView

0 голосов
/ 22 октября 2009

У меня проблема, и я чувствую, что это что-то простое, что я не делаю правильно.

У меня запущен простой проект ASP.NET. У меня есть DataSet, который я заполняю из базы данных Oracle. Таблица в наборе данных имеет два столбца: «account_code» и «account_descr».

Пользователь вводит поисковый запрос в текстовое поле. Я использую LINQ для запроса, чтобы получить результаты из DataSet и поместить их в другую переменную.

Затем я пытаюсь связать переменную с сеткой.

Код:

Dim results = AccountsDataSet.Tables("Results")

Dim filteredResults = From q In results Where q.Item("account_code").ToString.StartsWith(search) Select q.Item("account_code")

GridView1.DataSource = filteredResults
GridView1.DataBind()

Код, как указано выше, работает. Единственное, что показывает только один столбец. Мне нужно, чтобы показать обе колонки. Но если я изменю строку LINQ на это:

Dim filteredResults = From q In results Where q.Item("account_code").ToString.StartsWith(search) Select q.Item("account_code"), q.Item("account_descr")

выдает ошибку «Имя переменной диапазона может быть выведено только из простого или квалифицированного имени без аргументов.»

Есть идеи?

Ответы [ 3 ]

0 голосов
/ 22 октября 2009

Ваш оператор select явно запрашивает один столбец. Следующая информация имеет отношение к вам, надеюсь, что это имеет смысл

Существует правило, за которым нужно следить, это правило LINQ, а не LINQ to Entities. Когда вы создаете свойство «на лету» в проекции и делаете это с помощью функции, LINQ не может понять, как вызвать это свойство, поэтому вы должны назвать его, как я это сделал, используя имя переменной «полное имя». 1003 *

Dim custs = From cust In .Customer  By cust.FullNameAlpha 
SELECT cust.ContactID, fullname = cust.LastName.Trim & "," & cust.FirstName
0 голосов
/ 22 октября 2009

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

 gvCustomers.DataSource = from c in ds.Tables[0].AsEnumerable()
                                         where c["FirstName"].ToString().StartsWith("J")
                                         select new { FirstName = c["FirstName"].ToString(), LastName = c["LastName"].ToString() }; 
                gvCustomers.DataBind(); 

Поскольку DataTable не является IEnumerable, я использовал метод AsEnumerable (), который будет возвращать строго типизированную коллекцию DataRow. Вы также можете явно указать тип, как показано в следующем коде:

  gvCustomers.DataSource = from DataRow c in ds.Tables[0].Rows
                                             where c["FirstName"].ToString().StartsWith("J")
                                             select new { FirstName = c["FirstName"].ToString(), LastName = c["LastName"].ToString() }; 
                    gvCustomers.DataBind(); 

Надеюсь, это поможет!

0 голосов
/ 22 октября 2009

Поправьте меня, если я ошибаюсь, но не должна ли строка LINQ быть такой:

Dim filteredResults = From q In results Where q.Item("account_code").ToString.StartsWith(search) Select New With { .AccountCode = q.Item("account_code"), .AccountDesc = q.Item("account_descr") }

Вместо выбора одного свойства, выберите весь объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...