Почему мой источник данных DataGridView не рисует строки? - PullRequest
0 голосов
/ 19 апреля 2011

У меня проблема с моим DataGridView.DataSource, и это заняло у меня много времени на решение этой проблемы. Ниже приведен код:

string[] queryWords = singleQuery.Split(' ');           // Split the query words according the "space" character

// Compose the SQL select query
string selectClause = @"SELECT ID, CategoryID, Name, UnitID, Price, QuantityAgen, QuantityBanjer, QuantityMalalayang, QuantitySorong FROM Product WHERE ";

// Add the where clauses inside the SQL select query
for (int i = 0; i < queryWords.Length; i++)
{
    selectClause += "(Name LIKE '%" + queryWords[i] + "%')";
    if (i < queryWords.Length - 1)
        selectClause += " AND ";
}

// Initiate the query and get the appropriate results
IEnumerable<SumberRejekiProgram.Code.Product> resultQuery = dbProduct.ExecuteQuery<SumberRejekiProgram.Code.Product>(selectClause);
var finalResult = from p in resultQuery
                  select new { Name = p.Name, Price = p.Price, Unit = p.Unit.Name };

// Bind the DataGridView according to the final query result in resultQuery variable
dgvSearch.DataSource = resultQuery;

Когда я отлаживаю код, и resultQuery, и finalResult содержат результаты, которые я хочу. Тем не менее, когда я устанавливаю «dgvSearch.DataSource», результаты не появляются в строке, даже если я попробовал и dgvSearch.DataSource = resultQuery и dgvSearch.DataSource = finalResult. DataGridView просто пуст (кроме столбца).

После выполнения кода я отлаживаю "dgvSearch", чтобы убедиться, что DataSource работает правильно и работает. Все результаты находятся внутри DataSource, но почему-то DataGridView не будет отображать его, хотя я назвал dgvSearch.show().

Может ли кто-нибудь помочь мне в этом? Я чувствую, что хочу убить себя T_T. Заранее большое спасибо.

Ответы [ 3 ]

8 голосов
/ 19 апреля 2011

Проблема в том, что вы настроили выполнение запроса LINQ, но на самом деле вы еще не выполнили его, даже когда пытаетесь связать его результаты с вашим DataGridView.Чтобы выполнить запрос LINQ, вам нужно «прикоснуться» к результатам запроса, например, в цикле for или по телефону ToList().Это называется «отложенное выполнение».

Поэтому измените строку, с которой вы связываетесь, и она должна работать (при условии, что ваш код верен):

dgvSearch.DataSource = resultQuery.ToList();
0 голосов
/ 19 апреля 2011

Вы вызываете dgvSearch.DataBind() после установки его свойства DataSource?

Кроме того, использование конкатенации строк непосредственно в вашем SQL очень и очень плохо (выполните быстрый поиск "SQL-инъекции").Либо сделайте свой запрос параметризованным, либо сверните его в свой запрос Linq.В зависимости от конкретного поставщика, которого вы используете, это может работать или не работать:

// Initiate the query and get the appropriate results
var resultQuery = from p in dbProduct.Product
                  select new { Name = p.Name, Price = p.Price, Unit = p.Unit.Name };

// Add the where clauses
for (int i = 0; i < queryWords.Length; i++)
{
    resultQuery = resultQuery.Where(p => p.Name.Contains(queryWords[i]));
}

// Bind the DataGridView according to the final query result in resultQuery variable
dgvSearch.DataSource = resultQuery;
dgvSearch.DataBind();
0 голосов
/ 19 апреля 2011

Вы должны попытаться вызвать метод Page.DataBind после установки источника данных.

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

http://msdn.microsoft.com/en-us/library/fbk67b6z.aspx#Y210

...