我正在使用BindingSource.Find()在刷新DataGridView后返回到用户的位置。我使用BindingSource.Find()和RowID作为我正在搜索的DataColumn。不幸的是,Oracle可以返回两个仅在它们的情况下不同的RowID。
BindingSource.Find()返回第一个匹配,无论大小写。
查看MSDN文档:
public int Find(string propertyName, Object key)
它表示propertyName比较不区分大小写,但没有提到密钥比较是否。
有谁知道如何使BindingSource.Find区分大小写?
答案 0 :(得分:1)
对于DataView
,您需要做的就是将父CaseSensitive
的{{1}}属性设置为true。我只是使用以下代码快速原型化,并且工作正常:
DataTable
对于其他类型的IBindingList,正如文档所说,你需要一个底层列表来实现一个区分大小写的Find。为了完整起见,我已经展示了以下代码:
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;
}
CaseSensitiveBindingList的代码是:
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; }
}
该代码几乎可以肯定地得到改进,但显示了一般概念。