[.NET]設定物件Binding的格式

[.NET]設定物件Binding的格式

前陣子因為資料表存放金額欄位的資料格式從float改成money([SQL]資料庫使用FLOAT欄位來記錄金額對嗎?),結果程式執行起來後,那些變成欄位居然都出現了小數點4位的0,如下,

image

 

因為原本的程式中並沒有特別去控制數值的格式,所以當資料庫中是money格式,Bind到物件的呈現出來就會到小數4位。如下,

string queryString = @"SELECT *, UnitPrice * Quantity * 10 AS TotalPrice, GETDATE() as CurrDate FROM [dbo].[Order Details]";
using (SqlConnection conn = new SqlConnection(@"Server=.;Database=NORTHWND;Trusted_Connection=True;"))
{
	try
	{
		conn.Open();
		SqlDataAdapter da = new SqlDataAdapter(queryString, conn);
		DataTable order_Details = new DataTable();
		da.Fill(order_Details);
		bs.DataSource = order_Details;
		dataGridView1.DataBindings.Clear();
		dataGridView1.DataSource = bs;

		lblOrderID.DataBindings.Clear();
		lblOrderID.DataBindings.Add("Text", bs, "OrderID");

		lblProductId.DataBindings.Clear();
		lblProductId.DataBindings.Add("Text", bs, "ProductID");

		lblUnitPrice.DataBindings.Clear();
		lblUnitPrice.DataBindings.Add("Text", bs, "UnitPrice");

		txtTotalPrice.DataBindings.Clear();
		txtTotalPrice.DataBindings.Add("Text", bs, "TotalPrice");
	}
	catch (Exception ex)
	{
		MessageBox.Show(ex.ToString());
	}
	finally
	{

		conn.Close();
	}
}

 

小章討論了一下,GridView要設定DataGridViewColumn的DefaultCellStyle.Format屬性(資料庫中是money到Ado.NET中是decimal)。

//因為money取出來的值會有小數4位,所以要設定format
string myGridMoneyFormat = @"#,##0.####";

//處理GridView的欄位
foreach(DataGridViewColumn dc in dataGridView1.Columns){
	//判斷值為decmial就要套用格式
	if (dc.ValueType == typeof(decimal))
		dc.DefaultCellStyle.Format = myGridMoneyFormat;
}

 

而Label, TextBox的話,小弟發現,可以設定CurrencyManager.Bindings中的Binding物件的FormatString屬性,並設定FormattingEnabled屬性為true。

//處理TextBox欄位,判斷Binds中是否有為decmial就要套用格式
string myTextBoxMoneyFormat = @"###0.####";
foreach (Binding bd in bs.CurrencyManager.Bindings)
{
	string columnName = bd.BindingMemberInfo.BindingField;
	if (order_Details.Columns[columnName].DataType == typeof(decimal))
	{
		bd.FormatString = myTextBoxMoneyFormat;
		bd.FormattingEnabled = true;
	}
}

 

而這些格式設定可定義在config中,可依使用者的需求來調整它。

string queryString = @"SELECT *, UnitPrice * Quantity * 10 AS TotalPrice, GETDATE() as CurrDate FROM [dbo].[Order Details]";
using (SqlConnection conn = new SqlConnection(@"Server=.;Database=NORTHWND;Trusted_Connection=True;"))
{
	try
	{
		conn.Open();
		SqlDataAdapter da = new SqlDataAdapter(queryString, conn);
		DataTable order_Details = new DataTable();
		da.Fill(order_Details);
		bs.DataSource = order_Details;
		dataGridView1.DataBindings.Clear();
		dataGridView1.DataSource = bs;

		lblOrderID.DataBindings.Clear();
		lblOrderID.DataBindings.Add("Text", bs, "OrderID");

		lblProductId.DataBindings.Clear();
		lblProductId.DataBindings.Add("Text", bs, "ProductID");

		lblUnitPrice.DataBindings.Clear();
		lblUnitPrice.DataBindings.Add("Text", bs, "UnitPrice");

		txtTotalPrice.DataBindings.Clear();
		txtTotalPrice.DataBindings.Add("Text", bs, "TotalPrice");

		//因為money取出來的值會有小數4位,所以要設定format
		string myGridMoneyFormat = System.Configuration.ConfigurationManager.AppSettings["GridMoneyFormat"];

		//處理GridView的欄位
		foreach(DataGridViewColumn dc in dataGridView1.Columns){
			//判斷值為decmial就要套用格式
			if (dc.ValueType == typeof(decimal))
				dc.DefaultCellStyle.Format = myGridMoneyFormat;
		}

		//處理TextBox欄位,判斷Binds中是否有為decmial就要套用格式
		string myTextBoxMoneyFormat = System.Configuration.ConfigurationManager.AppSettings["TextBoxMoneyFormat"];
		foreach (Binding bd in bs.CurrencyManager.Bindings)
		{
			string columnName = bd.BindingMemberInfo.BindingField;
			if (order_Details.Columns[columnName].DataType == typeof(decimal))
			{
				bd.FormatString = myTextBoxMoneyFormat;
				bd.FormattingEnabled = true;
			}
		}
		 
	}
	catch (Exception ex)
	{
		MessageBox.Show(ex.ToString());
	}
	finally
	{
		
		conn.Close();
	}
}

 

image

 

經過了Format後,原本數值沒有三位一撇,現在也能透過這種方式來達成。 同樣的,日期格式也能這樣達到哦。

測試檔案:設定Money的格式.zip

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^