winform项目——仿QQ即时通讯程序13:添加好友及发送验证消息

编程项目2019/12/22 22:26:11阅读:792

上一篇文章完成了服务端程序的优化,本篇文章将实现主界面初始化以及添加好友发送验证消息操作。

回顾上一次,我们客户端程序做到登录后连接上服务器,我们接着按照程序应该有的步骤将功能依次实现。

首先,登录后,加载主界面。主界面需要初始化一些东西。

初始化用户信息

因为我们做的比较简单,用户信息只有账号、昵称和密码,所以要初始化的用户信息也就只有昵称了。

在Major主窗体加载事件中,将之前我们测试生成会话和好友列表的代码注释掉,然后写一个初始化用户数据函数:

private void Major_Load(object sender, EventArgs e)
{
CheckForIllegalCrossThreadCalls = false;
//for (int i = 0; i < 100; i++)
//{
// loadtalk(i,loadTalkMessageList());
// loadFriends(i, loadFriendList());
//}
//窗体加载时初始化
//初始化用户信息
initUserData();
}

接着写出函数体:

private void initUserData()
{
SqlDataReader sdr = SqlHelper.ExecuteReader("select * from Users where Account='" + Common.Account + "'");
//加载昵称
if (sdr.Read())
{
lbl_NickName.Text = sdr[3].ToString();
}
sdr.Close();
}

很简单,利用账号查找昵称,将主界面上的昵称label的text更改就行了。

然后应该是初始化会话列表和好友列表,但是我们还没有好友,所以现在不做这两个功能。我们先来做查找好友和添加好友功能。

查找好友功能实现

我们切换到查找好友界面,只需要实现查找按钮的点击事件即可:

private void button1_Click(object sender, EventArgs e)
{
//for (int i = 0; i < 10; i++)
//{
// add_panel(list[i].Account,list[i].NickName);
//}
//先移除flowlayoutpanel上的控件
flowLayoutPanel1.Controls.Clear();
//根据账号查找用户
List userlist = loadUser();
if (userlist.Count > 0)
{
for (int i = 0; i < userlist.Count; i++)
{
add_panel(userlist[i].Account, userlist[i].NickName);
}
label2.Visible = true;
label2.Text = "找到" + userlist.Count + "个用户";
}
else
{
label2.Visible = true;
label2.Text = "未找到符合条件的用户";
}

}

接着是loadUser方法:

private List loadUser()
{
List list = new List();
string searchtext = textBox1.Text;
SqlDataReader sdr = SqlHelper.ExecuteReader("select * from Users where Account like '%"+searchtext+"%'");
while (sdr.Read())
{
User u = new User();
u.Account = sdr[1].ToString().Trim();
u.NickName = sdr[3].ToString().Trim();
list.Add(u);
}
sdr.Close();
return list;
}

因为之前做界面时的add_panel方法已经做好了,调用一次就是一个查找到的结果,因此我们将查找到的结果封装到List中,方便使用。User是一个用户模型类,前面的文章已经提到。采用模糊查询,更方便找到用户。

查找到用户

添加按钮的点击事件

接着我们需要给查找到的用户上面的添加按钮实现点击事件。点击“+好友”按钮就应该弹出添加好友界面,但是我们需要将该用户的账号和昵称传递过去。那么怎么拿到账号呢?其实在我们的add_panel中已经有了用户的账号和昵称,我们只需要用什么东西保存它们即可。既然我们点击的是这个添加按钮,那么这里我们就采用“+好友”这个按钮的Name属性来存储该用户的账号和昵称,点击的时候只需要拿到该按钮的Name属性就拿到了用户的账号的昵称,在add_panel中的代码如下:

Button add_btn = new Button();
add_btn.Location = new System.Drawing.Point(100, 60);
add_btn.Name = account + Common.splitFlag+nickName;
add_btn.Size = new System.Drawing.Size(50, 20);
add_btn.Text = "+好友";
add_btn.UseVisualStyleBackColor = true;
add_btn.MouseClick += Add_btn_MouseClick;

可以看到它的Name属性是由账号和昵称加分隔符组成的。然后是Add_btn_MouseClick方法的实现:

private void Add_btn_MouseClick(object sender, MouseEventArgs e)
{
AddFriend af = new AddFriend();
af.Tag = ((Button)sender).Name;
af.Show();
}

这里可以看到,我们在show出添加好友窗体之前,该用户的账号、昵称通过该按钮的Name属性获得,然后赋值给了添加好友窗体的Tag属性,该属性既能赋值,又能得到值,而且该属性类型为object,用来传递信息真的太适合了,比给窗体添加静态公共字段实现传参好太多了。

添加好友界面

我们将参数传递过去了,需要在添加好友窗体中进行处理。

添加好友功能的实现

1.首先,我们需要处理传递过来的信息

private void AddFriend_Load(object sender, EventArgs e)
{
string[] textarr = this.Tag.ToString().Split(new string[] {Common.splitFlag }, StringSplitOptions.None);
lbl_Account.Text = textarr[0];
lbl_NickName.Text = textarr[1];
}

2.其次,实现发送按钮的点击事件

private void send_btn_Click(object sender, EventArgs e)
{
string content = confirmmsg_txt.Text;
Common.sandMsg(lbl_Account.Text+ Common.splitFlag+content);
MessageBox.Show("发送成功!");
this.Close();
}

发送成功

调用我们之前定义的Common类中封装的sandMsg方法即可。这里要注意,发送的消息是验证消息,上一篇文章中我们规定验证消息不带有时间,因此只需要发送账号和内容即可。因为我们还没有实现客户端接收消息功能,因此发送的验证消息只能存放在离线消息表中,我们可以在数据库中看一下有没有记录,有的话就说明我们的服务端程序是没有问题的。

数据库中的记录

其实到这里都不算太困难,因为我们前期打好了基础,服务端程序也已经完善。后面的客户端接收需要区分验证消息和普通消息,如何在界面上显示以及如何在本地存储会话列表、验证消息历时记录、聊天记录等才是难点。下一篇文章中我们将要去实现第一个难题:验证消息的接收、显示和存储。

本文系小博客网站原创,转载请注明文章链接地址