C# 更改数据源属性后,DataGridView设计模式设置不起作用
我有一个Win表单应用程序,在其中一个表单中,我放置了一个文本框用于搜索,一个DataGridView用于显示结果。在网格中,我在设计模式下设置了一些设置,隐藏了一些列,并为列添加了标题文本。然后有一种方法可以这样填充网格:首先,它在PrsCode中搜索,如果没有找到,则搜索人员的姓氏,如果在上述两个字段中都没有找到匹配项,则需要显示一个空白网格C# 更改数据源属性后,DataGridView设计模式设置不起作用,c#,winforms,datagridview,C#,Winforms,Datagridview,我有一个Win表单应用程序,在其中一个表单中,我放置了一个文本框用于搜索,一个DataGridView用于显示结果。在网格中,我在设计模式下设置了一些设置,隐藏了一些列,并为列添加了标题文本。然后有一种方法可以这样填充网格:首先,它在PrsCode中搜索,如果没有找到,则搜索人员的姓氏,如果在上述两个字段中都没有找到匹配项,则需要显示一个空白网格 public void FillGrid1(bool IsSearching = false) { if (IsSearchi
public void FillGrid1(bool IsSearching = false)
{
if (IsSearching && !string.IsNullOrEmpty(TxbSearch.Text.Trim()))
{
var prsCode = from p in db.Prs
join pd in db.PDPs on p.ID equals pd.PrsID
where p.PrsCode.StartsWith(TxbSearch.Text.Trim())
select p;
var prsLname = from p in db.Prs
join pd in db.PDPs on p.ID equals pd.PrsID
where p.Lname.Contains(TxbSearch.Text.Trim())
select p;
if (prsCode.Count() > 0)
{
DG_PDP.DataSource = from p in db.Prs
join pd in db.PDPs on p.ID equals pd.PrsID
where p.PrsCode.StartsWith(TxbSearch.Text.Trim())
select p;
}
else if (prsLname.Count() > 0)
{
DG_PDP.DataSource = from p in db.Prs
join pd in db.PDPs on p.ID equals pd.PrsID
where p.Lname.Contains(TxbSearch.Text.Trim())
select p;
}
else
{
DG_PDP.DataSource = null;
}
}
else
{
DG_PDP.DataSource = from p in db.Prs
join pd in db.PDPs on p.ID equals pd.PrsID
select p;
}
在文本框的TextChanged事件中,我写了如下内容:
FillGrid1(true);
当输入并找到匹配项时,它工作得很好。当没有找到匹配项时,它会显示一个空白网格,这很好。但是,在按BackSpace键并清理文本框以重新键入字符串后,如果再次找到匹配项,并且网格显示数据,则设计模式设置的列可见性和标题文本等整个设置都不起作用,就像从未执行过一样。如果我对else块进行注释
else
{
DG_PDP.DataSource = null;
}
设置问题已解决,但我搜索的最后一个目标尚未实现:
如果在上述两个字段中都没有找到匹配项,则需要显示一个空白网格
我找到了答案,因为在LINQ查询中select之后有一个新的关键字,所以datagridview.datasource必须具有与查询的新块中定义的字段相同的字段,即使查询显示null。这可能被认为是一个幽默的解决方案,但因为在我的DB中,PrsID从1开始,而不是DG_PDP.DataSource=null,所以我将0放在同一查询的where子句中,就像其他if子句一样,它们当然什么也不返回。这样,设计模式设置的设置就不会损坏。如下所示:
public void FillGrid1(bool IsSearching = false)
{
if (IsSearching && !string.IsNullOrEmpty(TxbSearch.Text.Trim()))
{
var prsCode = from p in db.Prs
join pd in db.PDPs on p.ID equals pd.PrsID
where p.PrsCode.StartsWith(TxbSearch.Text.Trim())
select p;
var prsLname = from p in db.Prs
join pd in db.PDPs on p.ID equals pd.PrsID
where p.Lname.Contains(TxbSearch.Text.Trim())
select p;
if (prsCode.Count() > 0)
{
DG_PDP.DataSource = from p in db.Prs
join pd in db.PDPs on p.ID equals pd.PrsID
where p.PrsCode.StartsWith(TxbSearch.Text.Trim())
select p;
}
else if (prsLname.Count() > 0)
{
DG_PDP.DataSource = from p in db.Prs
join pd in db.PDPs on p.ID equals pd.PrsID
where p.Lname.Contains(TxbSearch.Text.Trim())
select p;
}
else// it means no match has been found
{
//DG_PDP.DataSource = null;
DG_PDP.DataSource = from p in db.Prs
join pd in db.PDPs on p.ID equals pd.PrsID
where p.id==0 // I know that there is no such an ID
select p;
}
}
else
{
DG_PDP.DataSource = from p in db.Prs
join pd in db.PDPs on p.ID equals pd.PrsID
join ep in db.ExecutivePosts on pd.ExePID equals ep.ID
join pr in db.PDP_Priorities on pd.PriorityID equals pr.ID
join ps in db.PDP_Satisfactions on pd.SatisfactionID equals ps.ID
join s in db.SubCrts on pd.SubCrtID equals s.ID
select p;
}
当您点击backspace并删除所有内容时,及时文本框为空,如果正在搜索-&!string.IsNullOrEmptyTxbSearch.Text.Trim通过或阻止了它?请让我测试并告诉您。。。但是在测试之前,我认为它会阻止它,因为,正如我之前提到的,这个问题会由此引发;DG_PDP.DataSource=null;我把两个断点放在第一个之后!string.IsNullOrEmptyTxbSearch.Text.Trim和第二行DG_PDP.DataSource=null,当按backspace删除所有内容时,只命中第二个断点,它显示!string.IsNullOrEmptyTxbSearch.Text.Trim块我想,你同意吗?是的,这就是我怀疑的。而不是string.IsNullOrEmptyTxbSearch.Text.Trim使用!string.IsNullOrWhiteSpaceTxbSearch.text谢谢,但请您详细解释一下这个字符串方法和设计模式设置之间的关系?