我的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。 非常感谢你。
答案 0 :(得分:8)
问题在于您已将LINQ查询设置为运行但尚未实际执行它,即使您尝试将其结果绑定到DataGridView也是如此。要执行LINQ查询,您需要“触摸”查询结果,例如在for
循环中或通过调用ToList()
。这称为“延期执行”。
因此,更改绑定到此的行,它应该工作(假设您的代码正确):
dgvSearch.DataSource = resultQuery.ToList();
答案 1 :(得分:0)
您应该在设置数据源后尝试调用Page.DataBind方法。
您也可以尝试使用此处记录的bindingsource:
答案 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();