gpt4 book ai didi

c# - BindingSource.Find key 比较不区分大小写?

转载 作者:太空宇宙 更新时间:2023-11-03 14:30:50 25 4
gpt4 key购买 nike

我正在使用 BindingSource.Find() 在刷新 DataGridView 后返回到用户的位置。我使用 BindingSource.Find() 和一个 RowID 作为我正在搜索的 DataColumn。遗憾的是,Oracle 可以返回两个仅大小写不同的 RowID。

无论大小写,BindingSource.Find() 都会返回第一个匹配项。

查看 MSDN 文档:

public int Find(string propertyName, Object key)

上面说了propertyName比较是不区分大小写的,但是没有说key比较是否区分大小写。

有谁知道如何使 BindingSource.Find 区分大小写?

最佳答案

对于 DataView,您需要做的就是将父 DataTableCaseSensitive 属性设置为 true。我只是用以下代码快速制作了原型(prototype),它运行良好:

public Form1()
{
InitializeComponent();

DataSet set1 = new DataSet();

// Some xml data to populate the DataSet with.
string testXml =
"<?xml version='1.0' encoding='UTF-8'?>" +
"<numbers>" +
"<number><name>one</name></number>" +
"<number><name>two</name></number>" +
"<number><name>Two</name></number>" +
"<number><name>three</name></number>" +
"</numbers>";

// Read the xml.
StringReader reader = new StringReader(testXml);
set1.ReadXml(reader);

// Get a DataView of the table contained in the dataset.
DataTableCollection tables = set1.Tables;
// Set the CaseSensetive property
tables[0].CaseSensitive = true;
DataView view1 = new DataView(tables[0]);

// Create a DataGridView control and add it to the form.
dataGridView1.AutoGenerateColumns = true;

// Create a BindingSource and set its DataSource property to
// the DataView.
BindingSource source1 = new BindingSource();
source1.DataSource = view1;

// Set the data source for the DataGridView.
dataGridView1.DataSource = source1;

// Set the Position property to the results of the Find method.
int itemFound = source1.Find("name", "Two");
source1.Position = itemFound;
}

如文档所述,对于其他类型的 IBindingList,您需要一个实现区分大小写的 Find 的基础列表。为了完整起见,我在下面展示了执行此操作的代码:

public Form1()
{
InitializeComponent();

// This uses my CaseSensitiveBindingList which I have code for later
BindingList<DGVItems> source = new CaseSensitiveBindingList<DGVItems>()
{
new DGVItems { Number = "one" },
new DGVItems{Number = "two"},
new DGVItems{Number = "Two"}
};

BindingSource bindingSource = new BindingSource();
bindingSource.DataSource = source;

dataGridView1.DataSource = bindingSource;

var index = bindingSource.Find("Number", "Two");

// Index is 2 (third item) as desired.
MessageBox.Show(number.ToString());

}

public class DGVItems
{
public string Number { get; set; }
}

CaseSensitiveBindingList 的代码是:

public class CaseInsensitiveBindingList<T> : BindingList<T>
{
protected override int FindCore(PropertyDescriptor prop, object key)
{
string stringKey = key as string;

bool keyIsString = stringKey != null;

for (int i = 0; i < Count; ++i)
{
if (keyIsString && prop.PropertyType.IsAssignableFrom(typeof(string)))
{
if (stringKey.Equals(prop.GetValue(Items[i]).ToString(), StringComparison.CurrentCulture))
return i;
}
else
{
if (key.Equals(prop.GetValue(Items[i])))
return i;
}

}

return -1;
}
}

该代码几乎肯定可以改进,但显示了一般概念。

关于c# - BindingSource.Find key 比较不区分大小写?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2653632/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com