0

我有一个使用 Entity Framework 和 LINQ 的 Windows 窗体应用程序,并且有许多表单我使用 BindingNavigator 来导航数据,我想在导航器中添加一个文本框来搜索特定项目并导航到它,我做了一个从,但现在我必须对其他表单执行相同的步骤,并在每个表单中添加相同的事件和代码,所以我决定制作一个自定义 ToolStripTextBox 并在每个表单中使用它,但我必须使其通用因为每种形式都使用不同的对象或实体,这就是我想出的:

class ToolStripSearchBox<T> : ToolStripTextBox
{
    BindingSource dataSource;
    int currentIndex;

    public ToolStripSearchBox()
        : base()
    {
        KeyUp += new KeyEventHandler(ToolStripSearchBox_KeyUp);
    }

    void ToolStripSearchBox_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.F4)
        {
            string patern = Text;
            List<T> TList = dataSource.List.Cast<T>().ToList();
            int res = 0;
            T foundT = default(T);

            if (int.TryParse(patern, out res))
            {
                foundT = TList.Where(j => j. == res).First();

            }
            else
            {
                foundT = TList.First(j => (j.FirstName + " " + j.LastName).Contains(patern));
            }
            if (foundT == null)
            {
                return;
            }

            dataSource.Position = dataSource.IndexOf(foundT);
        }
    }
}

但问题是每个实体都有不同的属性要过滤,我正在考虑使用字符串参数来传递对象属性名称,但我没有找到将它与 LINQ 一起使用的方法。

对不起,如果有听写错误,但英语不是我的第一语言提前谢谢

4

1 回答 1

1

对于我在您的代码中看到的内容,“每个实体都有不同的属性可供过滤”,您的意思是诸如FirstName,LastName等属性。

如果是这种情况,很简单,您可以定义一个通用函数对象用作匹配器。您可以在构造时或初始化期间指定它。(我不太喜欢带有无参数构造函数的组件。)

class ToolStripSearchBox<T> {
    public Func<T, string, bool> Matcher { get; set; }
}

例如,在初始化这些用于搜索Foo's 的框之一期间,您将执行以下操作:

ToolStripSearchBox<Foo> fooSearchBox = new ToolStripSearchBox<Foo>();
fooSearchBox.Matcher = (j, pattern) => (j.Second + " " + j.Second).Contains(pattern);

也就是说,您的代码有很多问题: 请记住,First()如果未找到任何元素,扩展方法将引发异常;使用FirstOrDefault(). 我看到你也在使用foundT == null.. 我怀疑这甚至会编译。foundT == default(T)改为这样做。

class ToolStripSearchBox<T> {

    void ToolStripSearchBox_KeyUp(object sender, KeyEventArgs e)
    {
        ...
            foundT = TList.FirstOrDefault(this.Matcher(j, patern));
        ...
    }
}
于 2012-09-18T18:34:48.667 回答