标题: 利用反射读写属性,动态关联数据库
- yezizhe 2008-03-24 15:21 阅读:226
- 评论:1 查看评论 | 添加评论
 

最近在要在网站中做个调查表的用户控件,也就是一些单选题的集合,然后用户可以投票。

最开始为了方便,直接就在数据库将其选项默认最多为4个,下面是对应的实体层的代码(只是简单的与数据库对应)。

[图片][图片]SurveyData实体层
[图片]namespace Model
[图片][图片][图片]{
[图片]    public class SurveyData
[图片][图片]    [图片]{
[图片]        private int _id;
[图片]        private int _count1;    //被选择的次数
[图片]         private int _count2;
[图片]        private int _count3;
[图片]        private int _count4;
[图片]        private string _item1;    //选项文本
[图片]         private string _item2;
[图片]        private string _item3;
[图片]        private string _item4;
[图片]        private string _title;     //标题描述
[图片]
[图片]        //……读写属性….
[图片]    }
[图片]}
[图片]

 

然后在UI层根据判断每个字段是否为空,非空则加入RadioButtonList列表。

[图片][图片]绑定RadioButtonList数据
[图片]    private void BindData()
[图片][图片]    [图片]{
[图片]        Model.SurveyData model = new BLL.SurveyBLL().GetModel(SurveyID);
[图片]
[图片]        if(model.Item1 != "")
[图片]            RadioButtonList1.Items.Add(new ListItem(str.ToString());
[图片]        if(model.Item2 != "")
[图片]            RadioButtonList1.Items.Add(new ListItem(str.ToString());
[图片]        if(model.Item3 != "")
[图片]            RadioButtonList1.Items.Add(new ListItem(str.ToString());
[图片]        if(model.Item4 != "")
[图片]            RadioButtonList1.Items.Add(new ListItem(str.ToString());
[图片]}
[图片]

 

在提交按钮的点击事情也要进行类似判断,根据RadioButtonList的选择更新数据库。

这样做的话,可以完成功能,但是页面中耦合性太大。假使现在想把选项增加到6个,那么就要从数据库开始修改,最后要修改到UI层,在UI层中添加

[图片][图片]需要添加的语句
[图片]        if(model.Item5 != "")
[图片]            RadioButtonList1.Items.Add(new ListItem(str.ToString());
[图片]        if(model.Item6 != "")
[图片]            RadioButtonList1.Items.Add(new ListItem(str.ToString());
[图片]

这样的语句。这样三层就没有多大意义了。我们应该想想办法降低她们的耦合性。

首先,我们可以在数据库Survey表中添加多个字段[ItemCount],来表示选择项的总数,而且在UI层中可以根据这个字段自动的读取相应的[Item]和[Count]字段。我们发现,选择项的字段设置是有规律的:Item1,Item2,Item3,Item4,投票人数字段也是,所以很快的我们想到可以用反射来完成。

下面是修改过的RadioButtonList数据绑定函数,主要用了反射读取属性

[图片][图片]用反射绑定RadioButtonList1数据
[图片]    private void BindData()
[图片][图片]    [图片]{
[图片]       Model.SurveyData model = new BLL.SurveyBLL().GetModel(SurveyID);
[图片]       int num = model.ItemCount;
[图片]        Type t = model.GetType();
[图片]
[图片]        for (int i = 1; i <= num; i++)
[图片][图片]        [图片]{
[图片]            string str = t.GetProperty("Item" + i.ToString()).GetValue(model, null).ToString();
[图片]            RadioButtonList1.Items.Add(new ListItem(str, i.ToString()));       
[图片] }
[图片]
[图片]   }
[图片]


接着在Button1_Click事件中用反射设置属性

[图片][图片]提交按钮事件
[图片]    protected void Button1_Click(object sender, EventArgs e)
[图片][图片]    [图片]{
[图片]        Model.SurveyData model = new BLL.SurveyBLL().GetModel(SurveyID);
[图片]        Type t = model.GetType();
[图片]        int i = RadioButtonList1.SelectedIndex;
[图片]        if(i == -1)
[图片][图片]        [图片]{
[图片]            LTP.Common.MessageBox.Show(this.Page, " 你没有选择选项");  
[图片]            return ;
[图片]        }
[图片]
[图片]i++;  //因为RadioButtonList索引从0开始,而例子中选项从Item1开始
[图片]int count = int.Parse(t.GetProperty("Count" + i.ToString()).GetValue(model, null).ToString());   //读取原来的数值
[图片]        count++;            //点击数加1
[图片]        t.GetProperty("Count" + i.ToString()).SetValue(model, count, null);
[图片]        new BLL.SurveyBLL().Update(model);   //用反射设置属性
[图片]        LTP.Common.MessageBox.Show(this.Page, "成功投票");
[图片]
[图片]    }
[图片]


到此,我们就利用反射写了一段UI层的代码,而且跟数据层和逻辑层耦合性不算高。以后修改数据库个数据层等就不需要修改UI层了,达到了分层的目的。

我也是刚刚开始学习反射,很开心有这样一个我觉得不错的例子用上了。当然,这个例子应该有更好的方法,欢迎大家交流。

文中用到了李天平老师的类库,大家可以上他BLOG看看,写的很好,很实用。

http://www.cnblogs.com/ltp/archive/2008/03/01/1087455.html

最后推荐子阳兄的BLOG,这里几篇关于反射的文章写的好好,收益匪浅。

http://www.cnblogs.com/JimmyZhang/category/107410.html

 


查看评论 | 添加评论
返回顶部 | 返回首页