【问题标题】:DataGridView design mode settings don't work after changing DataSource property更改 DataSource 属性后 DataGridView 设计模式设置不起作用
【发布时间】:2018-08-02 19:38:00
【问题描述】:

我有一个 Win Form 应用程序,在其中一个表单中,我放置了一个 TextBox 用于搜索和一个 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;
        }

在Text Box的TextChanged事件中,我写了如下:

FillGrid1(true);

键入并找到匹配项时,它运行良好。当没有找到匹配项时,它会显示一个空白网格,这很好。但是,在按下 BackSpace 并清理 TextBox 以重新键入字符串后,如果再次找到匹配项并且网格显示数据,则由设计模式设置的列可见性和标题文本等整个设置不起作用,就像它是从来没有做过。如果我评论 else 块

else
{
    DG_PDP.DataSource = null;
}

设置的问题解决了,但是我的最后一个搜索目标还没有达到:

如果在提到的两个字段中都没有找到匹配项,则需要显示一个空白网格

【问题讨论】:

  • 当您按退格键并删除所有内容时,及时文本框为空,if (IsSearching && !string.IsNullOrEmpty(TxbSearch.Text.Trim())) 是通过还是阻止它?
  • 让我测试并告诉你,拜托......但在测试之前,我认为它会阻止它,因为正如我之前提到的,问题由此触发; DG_PDP.DataSource = null;
  • 我放了两个断点,第一个在 !string.IsNullOrEmpty(TxbSearch.Text.Trim())) 之后,第二个在 DG_PDP.DataSource = null 行,当按退格键删除所有内容时,只有第二个断点点命中,它显示 !string.IsNullOrEmpty(TxbSearch.Text.Trim())) 块我想,你同意吗?
  • 是的,这就是我的怀疑。而不是!string.IsNullOrEmpty(TxbSearch.Text.Trim()) 使用!string.IsNullOrWhiteSpace(TxbSearch.Text)
  • 谢谢,但是请解释一下这个字符串方法和设计模式设置的那些设置之间的关系是什么?

标签: c# winforms datagridview


【解决方案1】:

我找到了答案,因为 LINQ 查询中“select”之后的“new”关键字,即使查询显示为 null,datagridview.datasource 也必须具有与查询的新块中定义的字段相同的字段。它可能被认为是一个幽默的解决方案,但由于在我的数据库中,PrsID 从 1 开始,而不是“DG_PDP.DataSource = null”,我将 0 放在与其他 if 子句相同的查询的“where”子句中,这当然不会返回任何内容。这样设计模式设置的设置就不会损坏。如下所示:

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;
}

【讨论】:

    猜你喜欢
    • 2018-10-03
    • 1970-01-01
    • 2011-04-12
    • 2021-09-10
    • 2014-05-28
    • 2018-10-09
    • 2011-08-29
    • 2015-10-01
    • 1970-01-01
    相关资源
    最近更新 更多