using System;
using System.Data;
using System.Windows.Forms;
using Zfy;
using Zfy.BusinessServer;
using Zfy.DataServer;
using Zfy.UserGui;

namespace Zfy.BusinessServer
{
	/// <summary>
	/// ZfyDataGrid ，类主要定义一些有关DataGrid的操作
	/// 如行数、列数，列标题文本设置、对齐方式、列宽设置等
	/// </summary>
	public abstract class DataGrid						    //抽象类与接口紧密相关，它们不能示例化，并且常常部分实现或根本不实现。
	{
		//		private string _strColTitle="";						//列标题文本字符串
		//		private string[] _strArrColTitle=new string[]{};	//分离列标题文本字符串	
		//
		//		private int _intRows;		//网格行数
		//		private int _intCols;		//网格列数
		
		public DataGrid()
		{
			//
			// TODO: 在此处添加构造函数逻辑
			//
		}

		//******************************************************************************************************************************************************************

		/// <summary>
		/// [静态方法]返回指定行、列数的一个DataTable，用于绑定DataGrid
		/// </summary>
		public static DataTable GetDataTable(int intRows,int intCols)
		{
			return GetDataTable(intRows,intCols,"");
		}	

		// [静态方法]，返回指定行、列数的一个DataTable，为GetDataTable重载服务
		public static DataTable GetDataTable(int intRows,int intCols,string strColTitle)
		{	
			//行、列数索引
			int intRowIndex,intColIndex;

			//定义一个新的数据表
			DataTable dt=new DataTable();
			
			//表列标题
			string[] strArrColTitle=new string[]{};
			if (strColTitle!="")
				strArrColTitle=strColTitle.Split(';');


			//判断行、列合法性
			if (intRows<0) 
				intRows=0;
			else if(intRows>int.MaxValue)
				intRows=int.MaxValue;

			if (intCols<0) 
				intCols=0;
			else if(intCols>int.MaxValue)
				intCols=int.MaxValue;


			//增加行
			for (intRowIndex=0;intRowIndex<intRows;intRowIndex++)
			{
				dt.Rows.Add(dt.NewRow());				
			}
			//增加列
			for (intColIndex=0;intColIndex<intCols;intColIndex++)
			{				
				//如果指定列标题，则写上	
				if( strArrColTitle.Length>intColIndex)
				{
					dt.Columns.Add(strArrColTitle[intColIndex]);	
					//为什么Caption不起作用？？？
					//dt.Columns[intColIndex].Caption =strArrColTitle[intColIndex];					
				}
				else
					dt.Columns.Add(intColIndex.ToString());

				//填写默认值为空串（.NET  TextColumn默认为"空"，但此指令无效）
				dt.Columns[intColIndex].DefaultValue="";
			}

			//dt.Columns[intColIndex].DefaultValue="";//但此指令无效，故用循环设置为""
			for(intRowIndex=0;intRowIndex<intRows;intRowIndex++)
			{
				for (intColIndex=0;intColIndex<intCols;intColIndex++)
				{
					dt.Rows[intRowIndex][intColIndex]="";
				}
			}
			
			//return dt.DefaultView ;
			return dt;		
		}//End Function




		/// <summary>
		/// 设置DataGrid列宽
		/// 用指定的列宽数组或用"；"分隔的字符串设置网格列宽。
		/// 适合已设置DataGridTableStyle的DataGrid
		/// </summary>
		public static void SetGridColWidth(DataGridTableStyle dgts,int[] ColWidth)
		{
			//列数
			int intCols;
			//列指针
			int intColIndex;

			//获取列数
			intCols=dgts.GridColumnStyles.Count;
			for (intColIndex=0;intColIndex<intCols;intColIndex++)
				//防下标越界
				if (ColWidth.Length>intColIndex)
					dgts.GridColumnStyles[intColIndex].Width=ColWidth[intColIndex];
				else
					return;
		}//End Function


		/// <summary>
		/// 设置DataGrid列宽
		/// 用指定的列宽数组设置网格列宽。
		/// 如果DataGrid有DataGridTableStyle则采用，否则新增一个DataGridTableStyle。
		/// </summary>
		/// <Info>
		///		<作者>周方勇</作者>
		///		<创建日期>2002-11-05</创建日期>
		///		<修改日期>2002-06-25</修改日期>
		///		<其它说明>
		///			原意：适合没有设置DataGridTableStyle的DataGrid，但如果一旦DataGrid已设置DataGridTableStyle，DataGrid将指向新的DataGridTableStyle，也就是前者将无效。
		///			改进：如果DataGrid有DataGridTableStyle则采用，否则新增一个DataGridTableStyle。这样不至于使当前已有DataGridTableStyle无效
		///		</其它说明>		
		/// </Info>
		public static void SetGridColWidth(System.Windows.Forms.DataGrid Grid,int[] ColWidth)
		{

			//如果DataGrid有DataGridTableStyle则采用
			if (Grid.TableStyles.Count>0)			
			{
				
				SetGridColWidth(Grid.TableStyles[Grid.TableStyles.Count-1],ColWidth);
				return;
			}
			
			DataGridTableStyle dgts=new DataGridTableStyle();
			//新增一个TableStyles，自动创建GridColumnStyles。
			Grid.TableStyles.Add(dgts);
			
			//调整列宽
			SetGridColWidth(dgts,ColWidth);
		}//End Function


		/// <summary>
		/// 设置DataGrid格式(对齐方式)
		/// 适合已设置DataGridTableStyle的DataGrid
		/// </summary>
		public static void SetGridAlignment(DataGridTableStyle dgts,string strAlignmentList)
		{
			//列数
			int intCols;
			//列指针
			int intColIndex;

			//空串返回
			if (strAlignmentList=="")
				return;

			string[] strAlignment=strAlignmentList.Split(';');

			//获取列数
			intCols=dgts.GridColumnStyles.Count;
			for (intColIndex=0;intColIndex<intCols;intColIndex++)
			{
				//当前列超出数据长将越界，返回
				if (strAlignment.Length-1<intColIndex)
					return;

				//Grid.TableStyles.Count-1是指刚加入的TableStyles
				switch (strAlignment[intColIndex].ToUpper())
				{
					case "0":
					case "L":
						dgts.GridColumnStyles[intColIndex].Alignment=HorizontalAlignment.Left;
						break;
					case "1":
					case "C":
						dgts.GridColumnStyles[intColIndex].Alignment=HorizontalAlignment.Center;
						break;
					case "2":
					case "R":
						dgts.GridColumnStyles[intColIndex].Alignment=HorizontalAlignment.Right;
						break;
					default:
						dgts.GridColumnStyles[intColIndex].Alignment=HorizontalAlignment.Left;
						break;
				}//switch结束
			}	//for结束
		}		//函数结束

		/// <summary>
		/// 设置DataGrid格式(对齐方式)
		/// 如果DataGrid有DataGridTableStyle则采用，否则新增一个DataGridTableStyle。
		/// </summary>
		/// <Info>
		///		<作者>周方勇</作者>
		///		<创建日期>2002-11-05</创建日期>
		///		<修改日期>2002-06-25</修改日期>
		///		<其它说明>
		///			原意：适合没有设置DataGridTableStyle的DataGrid，但如果一旦DataGrid已设置DataGridTableStyle，DataGrid将指向新的DataGridTableStyle，也就是前者将无效。
		///			改进：如果DataGrid有DataGridTableStyle则采用，否则新增一个DataGridTableStyle。这样不至于使当前已有DataGridTableStyle无效
		///		</其它说明>		
		/// </Info>

		public static void SetGridAlignment(System.Windows.Forms.DataGrid Grid,string strAlignmentList)
		{
			//如果DataGrid有DataGridTableStyle则采用
			if (Grid.TableStyles.Count>0)
			{
				SetGridAlignment(Grid.TableStyles[Grid.TableStyles.Count-1],strAlignmentList);
				return;
			}
			
			DataGridTableStyle dgts=new DataGridTableStyle();
			//新增一个TableStyles，自动创建GridColumnStyles。
			Grid.TableStyles.Add(dgts);
			
			//调整列对齐方式
			SetGridAlignment(dgts,strAlignmentList);
		}   	//函数结束


	}//End Class
}//End namespace


