2

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

BindingSource.Find() 不考虑大小写返回第一个匹配项。

查看 MSDN 文档:

public int Find(string propertyName, Object key)

它说propertyName比较不区分大小写,但没有提到key比较是否。

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

4

1 回答 1

1

对于一个DataView你需要做的就是将CaseSensitiveparent 的属性设置DataTable为 true。我只是使用以下代码快速对其进行了原型制作,并且效果很好:

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

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

于 2011-04-09T17:20:41.837 回答