羽叶 发表于 2013-6-19 00:29:46

[源码教程]利用DevExpress的MRUEdit制作简单的仿QQ账号输入框

用过QQ的都知道,QQ登录窗口有个下拉菜单可以选择QQ账号,然后在鼠标悬停的QQ帐号后面有个叉叉,可以删除之前保存过的QQ帐号。挺炫的是吧? 我们今天就用DevExpress的一个控件来简单的实现该功能:MRUEdit
MRUEdit 本身就可以在内存中保存输入过的信息,输入一串文字后按回车,就可以在下拉菜单中出现输入过的文字,然后可以通过下拉列表的右侧按钮删除。

但我们需要的以下两个功能它并没有,需要我们通过代码扩展实现。
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)



cosky 发表于 2013-6-19 10:51:37

很详细的教程啊{:2_37:}

linuxpeng 发表于 2013-6-20 04:40:12

不错,把我现在的程序的登录窗加上这个功能,啊哈哈

lovenoms 发表于 2013-6-20 08:35:04

功能不错,自己做个例子试试。

qhdxzy 发表于 2013-6-20 09:53:49

详细,赞一个。感谢楼主分享

阳光海岸 发表于 2013-6-27 09:36:28

这个很不错的一个功能

Crxyz 发表于 2013-6-27 18:46:00

Looks very good, thx

ssa521 发表于 2013-6-27 22:33:49

很好,努力学习

热情沙漠 发表于 2013-7-4 09:38:04

恩,不错,很好的东西

yw3579293 发表于 2013-7-5 17:55:59

没有贡献分,下载不了。可惜了咯{:3_42:}

loya 发表于 2013-7-30 01:04:37

学习了,谢谢

Ivan 发表于 2013-7-30 12:03:36

楼主奉献精神 值得一顶啊 必须顶

junsen313 发表于 2013-12-8 23:46:45

支持!!谢谢分享!

dlsandy 发表于 2014-1-10 09:32:19

又学了一招。

huitouke120 发表于 2014-1-10 11:02:41

非常感谢楼主的代码

imchenzhy 发表于 2014-3-29 15:45:53

{:2_37:}很详细。。简约而不简单

xukui 发表于 2014-4-8 14:48:57

{:2_26:}不错

ianhyh 发表于 2014-4-10 15:21:01

很详细,很不错。赞一个

b46bl2 发表于 2014-4-10 21:30:28

不错,虽然简单,但是值得学习

pivyang 发表于 2014-5-22 22:42:46

东西不错正好能用上

yyf919 发表于 2014-6-10 12:32:22

我们不需要自己持久化吗?试试看

春秋剪 发表于 2014-6-17 09:03:37

怎么下载还要贡献值的?运到

xhdyhzw 发表于 2014-9-5 10:48:06

不错,把我现在的程序的登录窗加上这个功能

Relict™ 发表于 2014-12-19 17:56:58

{:2_26:} 获取不到action等于其他的值
只能获取到Refresh
不知道那块设置问题?

Relict™ 发表于 2014-12-19 17:57:47

忘了说了 用的是RepositoryItemMRUEdit
用MRUEdit可以获取到

蜗牛 发表于 2014-12-19 19:51:05

感谢楼主分享

851283773 发表于 2015-4-7 14:31:07

感谢分享

851283773 发表于 2015-4-8 11:25:14

貌似不是很全

fruitsdrink 发表于 2015-4-17 14:19:32

学习了,这个版块好

矿工码农g 发表于 2015-7-9 12:28:14

不错,谢谢
可惜下载买不起
页: [1] 2
查看完整版本: [源码教程]利用DevExpress的MRUEdit制作简单的仿QQ账号输入框