[源码教程]利用DevExpress的MRUEdit制作简单的仿QQ账号输入框
用过QQ的都知道,QQ登录窗口有个下拉菜单可以选择QQ账号,然后在鼠标悬停的QQ帐号后面有个叉叉,可以删除之前保存过的QQ帐号。挺炫的是吧? 我们今天就用DevExpress的一个控件来简单的实现该功能:MRUEditMRUEdit 本身就可以在内存中保存输入过的信息,输入一串文字后按回车,就可以在下拉菜单中出现输入过的文字,然后可以通过下拉列表的右侧按钮删除。
但我们需要的以下两个功能它并没有,需要我们通过代码扩展实现。
1.通常我们在提交登录时并不是立即将登录保存下来,而是在通过身份验证后才将合法的用户名和密码保存在本地。
2.如果客户端在本地保存了用户个性化数据,需要在删除下拉列表的时候一并将用户本地文件删除。
我们新建一个解决方案,并创建一个窗体,拖动一个MRUEdit和一个TextEdit到窗体中,MRUEdit作为用户名输入框命名为txtName, TextEdit输入密码用,命名为txtPassword ,再拖入一个按钮和其它几个复选框,如图
OK ,窗体就这么简单,接下来我们就说说刚才我们需要的两个功能实现。
第一个很简单:
MRUEdit有个AddingMRUItem事件,通过这个事件我们可以阻止Item的保存。private void txtName_AddingMRUItem(object sender, DevExpress.XtraEditors.Controls.AddingMRUItemEventArgs e)
{
e.Cancel = LockItems;
}说明:
LockItems是个bool类型的变量,如果我们直接将e.Cancel=false,它会在任何时候都会阻止 MRUItem 的添加,所以在这里通过一个变量来让它只在适当的时候工作。
我们先定义一个类,用作保存用户的登录信息。class Loginfo
{
public static Loginfo New(string Username, string Password, bool AutoLogin)
{
return new Loginfo() { Username = Username, AutoLogin = AutoLogin, Password = Password };
}
public string Username { get; set; }
public string Password { get; set; }
public bool AutoLogin { get; set; }
}再申明一个LoginArray,用作模拟保存用户登录信息的数据库。List<Loginfo> LoginArray = new List<Loginfo>();
接下来创建一些演示数据void CreateData()
{
LoginArray.Add(Loginfo.New("dxper", "", false));
LoginArray.Add(Loginfo.New("smart", "smart123456", false));
LoginArray.Add(Loginfo.New("test", "", false));
LoginArray.Add(Loginfo.New("danny", "danny123456", true));
LoginArray.Add(Loginfo.New("天堂羽叶", "天堂羽叶123456", false));
LoginArray.Add(Loginfo.New("神经正常", "神经正常123456", false));
}绑定MRUItem的代码void BindData()
{
LockItems = false;
txtName.Properties.Items.Clear();
for (int i = 0; i < LoginArray.Count; i++)
txtName.Properties.Items.Add(LoginArray.Username);
txtName.SelectedIndex = 0;
LockItems = true;
}F5运行如图
貌似还不错,接下来第二个功能比较头疼了,因为MRUEdit里找不到任何关于Item的事件。
别慌,找不到不代表没有。
如果手动代码你会发现MRUEdit的Properties属性里有个Items.CollectionChanged事件。没错,这就是我们要的东西。
接下来好办了,我们在窗口的LOAD事件里加入以下代码:private void frmMain_Load(object sender, EventArgs e)
{
txtName.Properties.Items.CollectionChanged += Items_CollectionChanged;
} void Items_CollectionChanged(object sender, CollectionChangeEventArgs e)
{
if (e.Action == CollectionChangeAction.Remove)
{
var usn = e.Element.ToString();
LoginArray.Remove(GetLoginfo(usn));
if (Username.Equals(usn)) Username = "";
XtraMessageBox.Show("账户已被删除", "操作成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}Getloginfo是个根据用户名查找登录信息的类Loginfo GetLoginfo(string Name)
{
for (int i = 0; i < LoginArray.Count; i++)
{
if (LoginArray.Username == Name)
return LoginArray;
}
return null;
}OK,以上为实现功能的核心代码,很简单吧?
代码简单所以木有注释{:3_63:}
更新全部源码下载:(DEV12.2.10)
很详细的教程啊{:2_37:} 不错,把我现在的程序的登录窗加上这个功能,啊哈哈 功能不错,自己做个例子试试。 详细,赞一个。感谢楼主分享 这个很不错的一个功能 Looks very good, thx 很好,努力学习 恩,不错,很好的东西 没有贡献分,下载不了。可惜了咯{:3_42:} 学习了,谢谢 楼主奉献精神 值得一顶啊 必须顶 支持!!谢谢分享! 又学了一招。 非常感谢楼主的代码 {:2_37:}很详细。。简约而不简单 {:2_26:}不错 很详细,很不错。赞一个 不错,虽然简单,但是值得学习 东西不错正好能用上 我们不需要自己持久化吗?试试看 怎么下载还要贡献值的?运到 不错,把我现在的程序的登录窗加上这个功能 {:2_26:} 获取不到action等于其他的值
只能获取到Refresh
不知道那块设置问题? 忘了说了 用的是RepositoryItemMRUEdit
用MRUEdit可以获取到 感谢楼主分享 感谢分享 貌似不是很全 学习了,这个版块好 不错,谢谢
可惜下载买不起
页:
[1]
2