~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
开发工具与关键技术:Visual Studio 2015 WPF XAML
作者:梅花开的冬天
撰写时间:2019 年 4 月 18 日
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
要实现这个功能首先需要了解一下身份证的构成
地址信息
所在省份的代码: 前 1~2 位数字表示:
所在城市的代码: 第 3~4 位数字表示;
所在区县的代码: 第 5~6 位数字表示;
个人日期信息
出生年的代码:第 7~10 位数字表示;
出生月的代码:第 11~12 位数字表示;
出生日的代码:第 13~14 位数字表示;
所在派出所信息
所在地的派出所的代码: 第 15~16 位数字表示.
性别信息
使用第 17 位数字表示性别. 奇数表示男性,偶数表示女性:
校检码
第 18 位数字是校检码:用来检验身份证的正确性。校检码可以是 0~10 的数字,10 用
x 表示。
第一种方法
第一种方法是使用文本改变事件捕捉到用户身份证输入框输入的字符串,当用户输入的字符串长度为 18 位时就将后天切割并转义的数据回填至页面的个个对应的部分如图当输入身份证号时,自动填入出生日期性别地址年龄
前端 XAML 部分代码
TextBlock Text="身份证号:" Grid.Column="0" Grid.Row="5"/>
后端 C#代码
///全局变量
public struct IDS
{
///生成五个字符串用于接收身份证各段信息
public string dmmc;
public string dmzm;
public string dmbz;
public string dmxh;
public string dmmcl;
public IDS(string a, string b, string c, string d, string e)
{
this.dmmc = a;
this.dmzm = b;
this.dmbz = c;
this.dmxh = d;
this.dmmcl = e;
}
}
private void txt_idCar_TextChanged_1(object sender, TextChangedEventArgs e)
{
//获取页面用户输入的身份证号码并去空格
string strIdCard = txt_idCar.Text.Trim();
try
{
//当输入的字符串长度==18 的时候
if (strIdCard.Length == 18)
{
bool all_pass = true;
if (all_pass != true)
{
MessageBox.Show("您输入的身份证号码有误,请修改!!"); return;
}
//string keys = strIdCard ;
string dmzm = strIdCard .Substring(0, 6);
int sex = int.Parse(keys.Substring(16, 1));
string birth_y = strIdCard .Substring(6, 4);
string birth_m = strIdCard .Substring(10, 2);
string birth_d = strIdCard .Substring(12, 2);
ListViewItem l = new ListViewItem();
foreach (IDS i in id)
{
if (i.dmzm.Equals(dmzm))
{
l.Content = i.dmmc + "公安局";
//l.SubItems.Add(i.dmmcl);
string strNow = DateTime.Now.Year.ToString();
decimal decNow = Convert.ToDecimal(strNow);
dtp_Birthday.Text = birth_y + "年" + birth_m + "月" +
birth_d + "日";
decimal decbirth_y = Convert.ToDecimal(birth_y);
decimal decAge = Convert.ToDecimal(decNow -
decbirth_y) + 1;
txt_Age.Text = decAge.ToString().Trim();
if (sex % 2 == 0)
{
//l.SubItems.Add("女");
cbo_gender.SelectedValue = 77;
} //if
else
{
//l.SubItems.Add("男");
cbo_gender.SelectedValue = 76;
}
break;
}
}
}
else
{
}
}
catch
{
MessageBox.Show("输入的身份证不正确。");
txt_idCar.Text = "";
}
}
第二种方法
第二种方法也是使用文本框改变事件,不同的是,这里用户每输入到一个信息节点,后台便会返回相对于的信息回填至页面
后端 C#代码部分
private void txt_idCar_TextChanged_1(object sender, TextChangedEventArgs e)
{
string strIdCard = txt_idCar.Text.Trim();
try
{
//new ASCIIEncoding 的实例
ASCIIEncoding ascii = new ASCIIEncoding();
//把 string 类型的参数保存到数组里
byte[] bytestr = ascii.GetBytes(strIdCard);
//遍历这个数组里的内容
foreach (byte c in bytestr)
{
//判断是否为数字
if (c < 48 || c > 57)
{
//不是,就弹出窗口
//因为身份证很长,这里就不清空了
MessageBox.Show("请输入正确的身份证号!");
}
}
//是,就继续
if (strIdCard.Length == 6)
{
string strAddress =
CheckIDCardGetDiQu.LoadAddress(txt_idCar.Text.ToString()); if (strAddress == "")
{
MessageBox.Show("身份证不合法!");
}
else
{
txt_Address.Text = strAddress;
}
}
else if (strIdCard.Length == 10)
{
//获取出生年
decimal nian = Convert.ToDecimal( strIdCard.Substring(6, 4)); //获取当前年
decimal newNian =
Convert.ToDecimal( DateTime.Now.Year.ToString()); //年纪为
decimal age = newNian - nian;
//将年龄绑定下拉框
txt_Age.Text = age.ToString();
}
else if (strIdCard.Length==14 )
{
string JieQuRiQi = strIdCard.Substring(6, 8);
//第一种方法使用 Insert 插入字符
//string RiQi = JieQuRiQi.Insert(4, "-");
//RiQi = RiQi.Insert(7, "-");
//第二种方法使用 DateTime 转换为时间格式再转回来 string RiQi = DateTime.ParseExact(JieQuRiQi, "yyyyMMdd