泛型的使用可以在同一代码上操作多种数据类型,当我们在进行动态数组查询的时候,添加的元素都是object类型的,如果要添加值类型,就要把它转为引用类型,而当要取出这个元素的时候,又要将它转为值类型,这就是C#视频里说的装箱和拆箱的操作,而使用泛型就不需要转化的步骤。我是在机房的充值记录查询的时候使用的,感觉提供了很大的便利。
IDAL层:
创建接口方法,这时候要在创建实体层的方法时,list<>中要传参数,在进行充值记录查询的时候,查询的是某个卡号,
不然在客户端实现的时候,遍历的数据是数据库表中的所有的数据。
public interface OnlineRecordIDAL
{
List<OnlineRecordModel> Getlist(OnlineRecordModel card);
DataTable checkinformation (OnlineRecordModel cardno);
}
DAL层:
这里写了两个方法,一个是对卡号的查询,一个是将查询的结果返回到客户界面;第二个方法就是泛型的应用
public class OnlineRecordDAL : IDAL.OnlineRecordIDAL
{
public DataTable checkinformation(OnlineRecordModel cardno)
{
SqlParameter ps = new SqlParameter("@Cardno", cardno.Cardno);
string sql = "select * from Online_Info where Cardno=@Cardno";
DataTable dt = SqlHelper.GetDataTable(sql, ps);
return dt;
}
public List<OnlineRecordModel> Getlist(OnlineRecordModel card)
{
List<OnlineRecordModel> list = new List<OnlineRecordModel>();
string sql = "select * from Online_Info where Cardno=@Cardno";
SqlParameter ps = new SqlParameter("@Cardno", card.Cardno);
DataTable dt = SqlHelper.GetDataTable(sql, ps);
//遍历表格,将数据转存到集合中;
foreach (DataRow row in dt.Rows)
{
list.Add(new OnlineRecordModel()
{
Sno = Convert.ToInt32(row["Sno"]),
SName = row["SName"].ToString(),
Ondate = row["Ondate"].ToString(),
Ontime = row["Ontime"].ToString(),
Offdate = row["offdate"].ToString(),
Offtime = row["Offtime"].ToString(),
Consumecash = row["Consumecash"].ToString(),
Balance = row["Balance"].ToString(),
});
}
return list;
}
}
Factory层:
貌似工厂层都一样,只是实现不同的功能创建的类名不同。
public class OnlineRecordFactory
{
private static readonly string AssemblyName = ConfigurationManager.AppSettings["Dal"];
public IDAL.OnlineRecordIDAL Getinformation()
{
string ClassName = AssemblyName + "." + "OnlineRecordDAL";
return (IDAL.OnlineRecordIDAL)Assembly.Load(AssemblyName).CreateInstance(ClassName);
}
}
B层:
就是进行逻辑的判断,判断卡号是否存在,存在返回true;
public class OnlineRecordBLL
{
public List<OnlineRecordModel> Getlist(OnlineRecordModel card)
{
OnlineRecordFactory fact = new OnlineRecordFactory();
OnlineRecordIDAL idal = fact.Getinformation();
return idal.Getlist(card);
}
public bool checkinformation(OnlineRecordModel cardno)
{
OnlineRecordFactory factcheck = new OnlineRecordFactory();
OnlineRecordIDAL idalcheck = factcheck.Getinformation();
DataTable dt = idalcheck.checkinformation(cardno);
if (dt.Rows.Count > 0)
{
return true;
}
else
{
return false;
}
}
Facade层:
将B层的逻辑数据传过来,就是B层的调用
public class OnlineRecordFacade
{
public List<OnlineRecordModel> Getlist(OnlineRecordModel card)
{
OnlineRecordBLL bll = new OnlineRecordBLL();
return bll.Getlist(card);
}
public bool checkinformation(OnlineRecordModel cardno)
{
OnlineRecordBLL bllcheck = new OnlineRecordBLL();
bool flag;
flag = bllcheck.checkinformation(cardno);
return flag;
}
}
UI层:
接收客户端输入的数据,传给实体层。这个功能是进行充值记录查询,所以,用一个dataGridView.DataSource显示客户端数据就可以了。
private void btnok_Click(object sender, EventArgs e)
{
if (txtCardno.Text.Trim() == "")
{
MessageBox.Show("请输入卡号后查询");
txtCardno.Focus();
}
else
{
OnlineRecordModel model = new OnlineRecordModel();
model.Cardno = Convert.ToInt32(txtCardno.Text.Trim());
OnlineRecordFacade fade = new OnlineRecordFacade();
bool flag = fade.checkinformation(model);
if (flag == false)
{
MessageBox.Show("你的账号不存在,请核对后重新输入");
txtCardno.Focus();
dGridV.DataSource = null;
}
else
{
OnlineRecordModel modelist = new OnlineRecordModel();
OnlineRecordFacade facadelist = new OnlineRecordFacade();
modelist.Cardno = Convert.ToInt32(txtCardno.Text.Trim());
dGridV.AutoGenerateColumns = false;
dGridV.DataSource = facadelist.Getlist(modelist);
}
}
但是dataGridView查询完要进行清空,查到了三种方法,
1.要想保持原有的列不被删除,就要清除原先绑定的DataTable中的数据,然后重新绑定DataTable
3、这是最简单,同时也不会删除字段名,前两种方法试过,都会删除列名。
dGridV.DataSource = null;