为什么我的DataGridView DataSource没有绘制行?

时间:2011-04-19 03:04:46

标签: c# linq datagridview ienumerable datasource

我的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 = resultQuerydgvSearch.DataSource = finalResult,结果也不会显示在行中。 DataGridView只是空的(列除外)。

我在代码执行后调试“dgvSearch”以确保DataSource正常工作。所有结果都在DataSource中,但不管怎样,DataGridView都不会显示它,尽管我调用了dgvSearch.show()

任何人都可以帮我这个吗?我觉得我想要自杀T_T。 非常感谢你。

3 个答案:

答案 0 :(得分:8)

问题在于您已将LINQ查询设置为运行但尚未实际执行它,即使您尝试将其结果绑定到DataGridView也是如此。要执行LINQ查询,您需要“触摸”查询结果,例如在for循环中或通过调用ToList()。这称为“延期执行”。

因此,更改绑定到此的行,它应该工作(假设您的代码正确):

dgvSearch.DataSource = resultQuery.ToList();

答案 1 :(得分:0)

您应该在设置数据源后尝试调用Page.DataBind方法。

您也可以尝试使用此处记录的bindingsource:

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

答案 2 :(得分:0)

在设置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();