我有一个私有方法,当用户在活动目录中搜索组名时会触发该方法。当'TxtBoxGroupNameSearch'中的文本发生更改时,将启动搜索。
private void SearchForAGroup(object sender, EventArgs e)
{
Cursor.Current = Cursors.WaitCursor;
dataGridGroupNameList.Rows.Clear();
try
{
string searchString = TxtBoxGroupNameSearch.Text;
var partialGroupNameMatches = AllGroupsResults.Cast<SearchResult>()
.Where(sr => sr.Properties["name"].Cast<String>()
.Any(s => s.Contains(searchString)));
object[] fields = new object[2];
int i = 1;
foreach (var item in partialGroupNameMatches)
{
fields[0] = i;
i++;
fields[1] = item.Properties["name"][0].ToString();
dataGridGroupNameList.Rows.Add(fields);
}
groupName = partialGroupNameMatches.ToList()[0]
.Properties["name"][0]
.ToString(); // gets the first GroupName on the grid
GetUsers(groupName); // calls a get user method - LDAP query to get all users
specific to the 'groupName'
BindToUserListGrid(AllGroupUsers); // Binds all users to a 2nd gridView
}
catch { }
Cursor.Current = Cursors.Default;
}
一切都很棒。代码是有用的。然而,手头存在性能问题。每次文本框中的文本发生更改时,都会启动方法,找到所有部分匹配,绑定到主网格视图,然后使用ldap查询特定于新绑定gridView上第一个GroupName的所有用户。然后将用户列表绑定到辅助UserList GridView。
我已经添加了等待光标让用户知道,在等待时间内后台正在做的事情......但是我想知道是否可以改进过程以减少次要列表的次数查询用户,然后绑定到辅助gridView。
1)引入等待时间,以便仅在等待特定时间(例如1s)后查询用户的辅助列表....示例: - 用户键入'a',然后'b'然后在输入任何其他内容之前等待1秒...仅在此1s等待我们查询特定于第一个groupName匹配的用户列表,以'ab'开头...而不是当前的方式,我们将查询列表第一次按键'a'的用户,然后将它们绑定到辅助网格。然后再次查询用户列表第二次击键'a'+'b',然后绑定到辅助网格...从而将时间减少1/2。
计算两次不同击键之间的TimeSpan可能很棘手: -
DateTime a = new DateTime();
DateTime b = new DateTime();
a = b; // previous stroke time
b = DateTime.Now; // current stroke time
if (b.Subtract(a).TotalSeconds > 2)
{
groupName = partialGroupNameMatches.ToList()[0].Properties["name"][0].ToString();
GetUsers(groupName);
BindToUserListGrid(AllGroupUsers);
}
然而,上述方法存在一些问题......主要是键击,静音和第一次击键(永远)和最后击键(直到相当多的时间超过)之间的区别。我想改进这个过程。建议是最受欢迎的。
2)或穿线。
我想从该领域的一些更多专家那里获得一些可能的建议。