C# 更改数据源属性后,DataGridView设计模式设置不起作用

C# 更改数据源属性后,DataGridView设计模式设置不起作用,c#,winforms,datagridview,C#,Winforms,Datagridview,我有一个Win表单应用程序,在其中一个表单中,我放置了一个文本框用于搜索,一个DataGridView用于显示结果。在网格中,我在设计模式下设置了一些设置,隐藏了一些列,并为列添加了标题文本。然后有一种方法可以这样填充网格:首先,它在PrsCode中搜索,如果没有找到,则搜索人员的姓氏,如果在上述两个字段中都没有找到匹配项,则需要显示一个空白网格 public void FillGrid1(bool IsSearching = false) { if (IsSearchi

我有一个Win表单应用程序,在其中一个表单中,我放置了一个文本框用于搜索,一个DataGridView用于显示结果。在网格中,我在设计模式下设置了一些设置,隐藏了一些列,并为列添加了标题文本。然后有一种方法可以这样填充网格:首先,它在PrsCode中搜索,如果没有找到,则搜索人员的姓氏,如果在上述两个字段中都没有找到匹配项,则需要显示一个空白网格

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谢谢,但请您详细解释一下这个字符串方法和设计模式设置之间的关系?