- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
是否可以在多个列上使用 BindingSource 的 Find 方法?
例如,假设我有一个显示当前宠物的 GridView ;两个组合框,cboPetType 和 cboGender;以及一个用于根据这两个组合框的值在 Pet 表中创建新记录的按钮。
现在,假设我只想要每种 PetType/Gender 组合中的一种(狗 - M、猫 - F 等)。因此,如果我的 BindingSource 中有 Dog - M 宠物,并且用户从组合框中选择 Dog 和 M,我想阻止用户通知他们组合已经存在。
过去,我使用 BindingSource.Find 方法来做类似的事情,但据我所知,这只适用于搜索一列(即 BindingSource.Find("PetType", cboPetType.SelectedValue );).
是否可以基于多列搜索绑定(bind)源?如果没有,有什么建议可以达到我想要的结果吗?非常感谢任何建议!
最佳答案
不,很遗憾,这是不可能的。虽然给定一个特定数据源,这样的搜索可能会相当简单,但以更通用的方式(如 BindingSource
会做的那样)做起来不太透明.一方面,语法不太明显。这是一个有点人为的解决方案:
public class Key
{
public string PropertyName {get; set;}
public object Value {get; set;}
}
public static int Find(this BindingSource source, params Key[] keys)
{
PropertyDescriptor[] properties = new PropertyDescriptor[keys.Length];
ITypedList typedList = source as ITypedList;
if(source.Count <= 0) return -1;
PropertyDescriptorCollection props;
if(typedList != null) // obtain the PropertyDescriptors from the list
{
props = typedList.GetItemProperties(null);
}
else // use the TypeDescriptor on the first element of the list
{
props = TypeDescriptor.GetProperties(source[0]);
}
for(int i = 0; i < keys.Length; i++)
{
properties[i] = props.Find(keys[i].PropertyName, true, true); // will throw if the property isn't found
}
for(int i = 0; i < source.Count; i++)
{
object row = source[i];
bool match = true;
for(int p = 0; p < keys.Count; p++)
{
if(properties[p].GetValue(row) != keys[p].Value))
{
match = false;
break;
}
}
if(match) return i;
}
return -1;
}
你可以这样调用它:
BindingSource source = // your BindingSource, obviously
int index = source.Find(
new Key { PropertyName = "PetType", Value = "Dog" },
new Key { PropertyName = "Gender", Value = "M" });
请记住,要使其可用,您确实需要一种更智能的比较算法,但我会将其作为练习留给读者。检查 IComparable
的实现将是一个好的开始。尽管如此,无论具体实现点如何,该概念都应该贯彻始终。
请注意,这不会利用底层数据源可能实现的任何可能的性能优化,而单列 Find
会。
关于c# - BindingSource.查找多个列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1767018/
我注意到这两种在 winforms 中实现数据绑定(bind)的方法。但是,我想知道其中哪一种更受欢迎(在整体性能方面,例如设计时间,效率?据我所知,这两种是: BindingSource 作为 Bi
是什么让我使用这样的东西: DataGridView dgvDocuments = new DataGridView(); BindingSource bindingSource = new Bind
我有一个带有数据 GridView 和一些绑定(bind)到绑定(bind)源的文本框的表单。表单上有一个新建按钮和保存按钮。我希望用户 单击“新建”按钮,这将导致网格转到新行并且文本框变为空白(因为
我想我很了解 BindingSource 类的作用——即在数据源和 UI 控件之间提供一层间接。它实现了 IBindingList 接口(interface),因此还提供了对排序的支持。而且我已经使用
我无法获取当前行值。我该怎么办? bindingSource1.DataSource = LData; (LData is Generic List) public DataRow currentRo
绑定(bind)源代码: Component.DataSource = new BindingSource(yourSource, ????); 我看到的所有示例都遵循这种模式,而不是 ????,我总
是否可以在多个列上使用 BindingSource 的 Find 方法? 例如,假设我有一个显示当前宠物的 GridView ;两个组合框,cboPetType 和 cboGender;以及一个用于根
我正在尝试绑定(bind)到 Linq-To-SQL 查询的结果,我已将其设置为填充图形。 该图沿着 X 轴的日期线和 Y 轴的货币线。有两个系列,一个是进钱的,一个是出钱的。 到目前为止还很简单。
我遇到的问题是过滤器不接受日期时间的时间部分。 为了清楚起见, 这有效。 " AND NextWorkDate <= #" + DateTime.Now.AddDays(1).ToString("dd
我的winform中有很多bindingsource,我想动态改变我的gridview的dataSource,所以我想通过名称获取bindingSource。我找到了以下代码来从我的 winform
我想根据日期从数据库中过滤值。 数据库中的日期包含如下值:2008-12-28 18:00:00。我的类(class)有一个 DateTime 变量,具体取决于我要过滤的内容。理想情况下它会像这样工作
为了解释这个问题,我把所有需要的东西都放到了一个小的示例应用程序中,希望能解释这个问题。我真的试图尽可能减少所有内容,但在我的实际应用程序中,这些不同的 Actor 彼此不认识,也不应该。因此,像“在
我有一个 C# Windows 窗体项目,其中包含一个包含 2 个列表框和一个按钮的窗体。 在 FormLoad 上,左侧 ListBox 填充了一个列表(大约 1800 项),其中包含有关证券(ID
使用绑定(bind)到绑定(bind)源控件的 datagridview 绑定(bind)到 LINQ to SQL类,我想知道如何将 bindingSource 定位到特定记录,也就是说,当我在文本
我有一个绑定(bind)到 DataTable 的 BindingSource。 我使用 BS 过滤器并希望使用 Bindingsource 迭代数据表的过滤数据集。 我知道我可以执行 MoveFir
这是我正在处理的表单部分: 以下代码使用 bindingSource 将 BindingNavigator 链接到数据集。我可以使用此绑定(bind)源将两个文本框连接到数据吗? 我是否只需要使用文本
我正在考虑使用数据绑定(bind) - 最简单的事情似乎是使用 BindingSource 来包装我的数据对象。 但是,虽然 CurrentItemChanged 事件会告诉我属性何时发生更改,但它不
这是我正在处理的表单部分: 以下代码使用 bindingSource 将 BindingNavigator 链接到数据集。我可以使用此绑定(bind)源将两个文本框连接到数据吗? 我是否只需要使用文本
来自微软:“BindingSource.ListChanged 事件在基础列表更改或列表中的项目更改时发生”。 但在我的示例中,事件会在每次位置更改时触发。表单有一个 UserControl、一个 B
我有一个只有 1 个对象作为数据源的 BindingSource。 我绑定(bind)了数据源上的一些值。这非常有效。 但是。 当我这样做时: bindingSource.DataSource = n
我是一名优秀的程序员,十分优秀!