寫點東西感覺特別累,也已經很久沒寫了。
最近在做一個winform類型的系統,其涉及到大量的表,有些表又包含大量的字段,所以當添加、更新實體時便會十分的繁瑣,一方面:需要把界面上的字段綁定到對應的實體(簡單點就是對象)上去,另一方面:需要把字段值賦值給界面上的控件。當字段的數量到一定數量時,便費時費力。
下面是我看到一種較好的方式,自己寫的示例。
1主要原理
微軟為控件類寫了個綁定方法Control.DataBindings,這個方法的作用是將控件的某個屬性值與對象的某個屬性值進行綁定,通俗的意思是維持控件的屬性值與對象的屬性值相等,這就是雙向綁定的意思。
2實現
定義了一個Person類,並定義一些成員,如下圖所示,“喜好”字段綁定的是combox,所以它的數據源是list,list中對象定義的類型是LikeT,liket就簡單的定義了顯示成員與值成員。
在窗體初始化時,實例化person類為Men對象,並將其綁定到界面的控件上。當更改控件中的內容時,DataBindings會自動將其更新回Men對象。為了驗證Men對象的內容是否改變,便添加了一個顯示Men對象成員的按鈕,點擊則會將Men對象顯示出來。
當我改變Name和OneDay后點擊顯示Men按鈕
3實現代碼如下
public Person Men { get; set; }
public IList<LikeT> AllLikes { get; set; }
public Form1()
{
InitializeComponent();
Men = new Person
{
Name = "mine",
IsAdult = true,
IsSpecial = "是",
Like = "1",
OneDay = DateTime.Now,
Introduce = "share one technolog"
};
AllLikes = new List<LikeT>
{
new LikeT() {ShowNumber = "a book", ValueNumber = "1"},
new LikeT() {ShowNumber = "a person", ValueNumber = "2"},
new LikeT() {ShowNumber = "a point", ValueNumber = "3"}
};
textBox1.DataBindings.Add("Text", Men, "Name");
checkBox1.DataBindings.Add("Checked", Men, "IsAdult");
dateTimePicker1.DataBindings.Add("Value", Men, "OneDay");
//下拉選擇框
comboBox1.DataSource = AllLikes;
comboBox1.DisplayMember = "ShowNumber";
comboBox1.ValueMember = "ValueNumber";
comboBox1.DataBindings.Add("SelectedValue", Men, "Like");
textBox2.DataBindings.Add("Text", Men, "Introduce");
//自定義數據格式,有興趣可以看看
Binding b = new Binding("Checked", Men, "IsSpecial");
// Add the delegates to the event.
b.Format += new ConvertEventHandler(StringToBool);
b.Parse += new ConvertEventHandler(BoolToString);
checkBox2.DataBindings.Add(b);
}
private void StringToBool(object sender, ConvertEventArgs cevent)
{
// The method converts only to string type. Test this using the DesiredType.
if (cevent.DesiredType != typeof(bool)) return;
// Use the ToString method to format the value as currency ("c").
cevent.Value = cevent.Value.ToString() == "是";
}
private void BoolToString(object sender, ConvertEventArgs cevent)
{
// The method converts back to decimal type only.
if (cevent.DesiredType != typeof(string)) return;
// Converts the string back to decimal using the static Parse method.
if ((bool)cevent.Value)
{
cevent.Value = "是";
}
else cevent.Value = "否";
}
private void button1_Click(object sender, EventArgs e)
{
l_Men.Text = JsonConvert.SerializeObject(Men);
}
4說明
person有個IsSpecial字段,這個字段如果類型設計為bool類型,那么如同IsAdult一樣簡單,但是我項目的數據庫設計為String類型,且字段長度為vachar2,存不下true或者false,存0或者1也許可以吧,但不知道對接的時候有沒有問題,所以我就強制讓是否來代替true或者false。
意識僅為個人看法,如果不當,希望能給我打幾個字,衷心感謝。