机房重构总结——泛型的使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lairyi/article/details/84204331

泛型的使用可以在同一代码上操作多种数据类型,当我们在进行动态数组查询的时候,添加的元素都是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;

猜你喜欢

转载自blog.csdn.net/lairyi/article/details/84204331