您的位置:首页 > 编程语言

分享两个PB移植到.NET的类,支持把PB代码复制到.NET里使用(1)

2014-11-07 11:33 507 查看
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Windows.Forms;
namespace LanTian.LIB
{
public sealed class DataTableChild
{
public DataTable DataTables;
/// <summary>
/// 引入了这个,是希望在setfilter之后,还能找回最原始最全的数据源。
/// 所以会在第一次setfilter前,对这个赋值
/// </summary>
public DataTable DataTablesOriginal;
DataSource.Fees_his_yb fe = new DataSource.Fees_his_yb();

public static implicit operator DataTableChild(DataTable datatable)
{
DataTableChild item = new DataTableChild();
item.DataTables = datatable;
return item;
}

#region Instance Various
private SqlConnection _Connection;

private SqlParameter[] meter;
/// <summary>
/// 给datatablechild提供sql语句
/// </summary>
/// <param name="TSQL"></param>
public string dataobject { get; set; }
public SqlParameter[] SqlParameters = null;

#endregion //Instance Various

#region retrieve
/// <summary>
/// 其实这个没什么用,真要retrieve的话,是要fill的
/// </summary>
/// <param name="meter"></param>
public void retrieve(SqlParameter[] meter)
{
SqlParameters = meter;
}
#endregion //retrieve

#region GetItemValues
public string getitemstring(int RowIndex, string columnname)
{
try
{
return DataTables.Rows[RowIndex - 1][columnname].ToString();//允许返回空值""
}
catch { return null; }
}
/// <summary>
/// 获取某行某列的int类型数据
/// </summary>
/// <param name="RowIndex">行数,起始为1</param>
/// <param name="columnname">列名</param>
/// <returns>返回int类型,没有数据则为null</returns>
public int? getitemnumber(int RowIndex, string columnname)
{
try
{
int Default = 0;
if (int.TryParse(DataTables.Rows[RowIndex - 1][columnname].ToString(), out Default))
{
return int.Parse(DataTables.Rows[RowIndex - 1][columnname].ToString());
}
else return null;
}
catch (Exception ex)
{
return null;
}
}
/// <summary>
/// 因为有时候取了值不一定会判断是不是空,即肯定有值
/// </summary>
/// <param name="RowIndex"></param>
/// <param name="columnname"></param>
/// <returns></returns>
public int getitemnumberN(int RowIndex, string columnname)
{
return int.Parse(DataTables.Rows[RowIndex - 1][columnname].ToString());
}
public double getitemdoubleN(int RowIndex, string columnname)
{
return double.Parse(DataTables.Rows[RowIndex - 1][columnname].ToString());
}
public double? getitemdouble(int RowIndex, string columnname)
{
try
{
double Default = 0;
if (double.TryParse(DataTables.Rows[RowIndex - 1][columnname].ToString(), out Default))
{
return double.Parse(DataTables.Rows[RowIndex - 1][columnname].ToString());
}
else return null;
}
catch (Exception ex)
{
return null;
}

}
/// <summary>
/// 获取某行某列的datetime类型数据
/// </summary>
/// <param name="RowIndex">行数,起始为1</param>
/// <param name="columnname">列名</param>
/// <returns>返回datetime类型,转换失败则为null</returns>
public DateTime? getitemdatetime(int RowIndex, string columnname)
{
DateTime dtime = DateTime.Now;
if (DateTime.TryParse(DataTables.Rows[RowIndex - 1][columnname].ToString(), out dtime))
{
return DateTime.Parse(DataTables.Rows[RowIndex - 1][columnname].ToString());
}
else return null;
}
public DateTime getitemdatetimeN(int RowIndex, string columnname)
{
return DateTime.Parse(DataTables.Rows[RowIndex - 1][columnname].ToString());

}
/// <summary>
/// 获取某行某列的Decimal类型数据
/// </summary>
/// <param name="RowIndex">行数,起始为1</param>
/// <param name="columnname">列名</param>
/// <returns>返回decimal类型,转换失败则为null</returns>
public Decimal? getitemdecimal(int RowIndex, string columnname)
{
decimal Default = 0;
if (decimal.TryParse(DataTables.Rows[RowIndex - 1][columnname].ToString(), out Default))
{
return decimal.Parse(DataTables.Rows[RowIndex - 1][columnname].ToString());
}
else return null;
}
public Decimal getitemdecimalN(int RowIndex, string columnname)
{
return decimal.Parse(DataTables.Rows[RowIndex - 1][columnname].ToString());
}
#endregion //GetItemValues

#region 解除约束
bool IsFirst = true;
private void AllowDBNULL()
{
if (IsFirst)
{
foreach (DataColumn dc in DataTables.Columns)
{
dc.AllowDBNull = true;//有些如autonumb的字段不允许为空,所以遍历一下, 都允许为空先
dc.ReadOnly = false;
// dc.Unique = false;//去掉唯一约束
}
IsFirst = false;
}
}
#endregion //解除约束
#region insertrow
/// <summary>
/// 插入行,返回新行所在的行数
/// </summary>
/// <param name="RowIndex"></param>
/// <returns></returns>
public int insertrow()
{
AllowDBNULL();
DataTables.Rows.Add();
return DataTables.Rows.Count;// 在setitem的时候已经减去了1
}
#endregion //insertrow

#region deleterow
//这个deleterow和pb不同,
//pb的是先find出行号,然后deleterow(行号)
//在.net里,可以做成省去了行号,而直接deleterow(条件)

//调用实例  dtc.deleterow("autonumb=53");
public void deleterow(string expression)
{
DataRow[] dr = DataTables.Select(expression);
if (dr.Length > 0)
{
for (int i = 0; i < dr.Length; i++)
{
DataTables.Rows.Remove(dr[i]);
}
}
}
#endregion //deleterow

#region setitem
public void setitem(int RowIndex, string columnname, object values)
{
AllowDBNULL();
if (DataTables.Rows.Count < 1) this.DataTables.Rows.Add();
DataTables.Rows[RowIndex - 1][columnname] = values;
}
#endregion //setitem

#region 属性
/// <summary>
/// 没有CurrentRow的概念,默认返回第一行先
/// </summary>
/// <returns></returns>
public int getrow()
{
return 1;
}
public int rowcount()
{
return DataTables.Rows.Count;
}
#endregion

#region setfilter
/// <summary>
/// 1.可以直接用l_da2=l_da2.setfilter(条件);
/// 如果想获取回最原始的数据源
/// l_da2=l_da2.DataTablesOriginal即可
/// 2.也可new一个datatable来存放
/// </summary>
/// <param name="Filter"></param>
/// <returns></returns>
public DataTable setfilter(string Filter)
{
DataTable dt_cache = DataTables.Clone();
DataTablesOriginal = DataTables;
DataRow[] dr = DataTables.Select(Filter);
foreach (DataRow row in dr)
{
dt_cache.ImportRow(row);
}
return dt_cache;
}
#endregion //setfilter

#region settransobject
public void settransobject(SqlConnection sqlc)
{
_Connection = sqlc;
}
#endregion //settransobject

#region Destroy
public void Destroy()
{
DataTables.Dispose();
}
#endregion //Destroy

#region find
/// <summary>
///
/// </summary>
/// <param name="expression">一个字符串,用于指定要查找的条件。其值是个逻辑表达式,表达式中可以使用列名。</param>
/// <param name="Start">一个长整数,用于指明从哪一行开始查找,该参数可以大于数据的总行数</param>
/// <param name="End">一个长整数,用于指明查找到哪一行结束查找。该参数可以大于数据的总行数。如果想从后向前查找,那么让end参数的值小于start参数即可。</param>
/// <returns>返回指定范围内满足查找条件的第一个数据行的行号。如果未找到满足条件的行,则函数返回0;出错时返回负值。</returns>
public int find(string expression, int Start, int End)
{
//暂时没找到找出datatable符合条件数据行的行号,就先完成>0则满足,=0不满足和出错负值先
//后面两个整型参数是为了和pb代码对应
return find(expression);

}
public int find(string expression)
{
try
{
DataRow[] dr = DataTables.Select(expression);
if (dr.Length > 0) return dr.Length;
else return 0;
}
catch { return -1; }

}
#endregion //find

#region setsort
//===pb的代码是这样调用的
//    l_da.setsort( "nClinReciInfo_recitype , Serial") //坦洲不按组号排序
//    l_da.sort( )

/// <summary>
/// 根据两个列名升序排序
/// 调用实例: dtc.setsort("autonumb","mediid");
/// </summary>
/// <param name="columnname"></param>
/// <param name="columnname2"></param>
public void setsort(string columnname, string columnname2)
{
DataView dv = DataTables.DefaultView;
dv.Sort = columnname + "," + columnname2 + " asc";
DataTables = dv.ToTable();
}
/// <summary>
/// 根据列名升序
/// 调用实例: dtc.setsort("mediid");
/// </summary>
/// <param name="columnname"></param>
public void setsort(string columnname)
{
DataView dv = DataTables.DefaultView;
dv.Sort = columnname + " asc";
DataTables = dv.ToTable();
}
#endregion//sort

#region Describe统计
/// <summary>
/// 统计
///pb代码 l_da.Describe("evaluate('sum(itemamou)',1)")
///public object Compute(string strExpression,string strFilter)
///调用实例:  MessageBox.Show(dtc.Describe("sum(mediid)").ToString());
/// </summary>
/// <returns></returns>
public object Describe(string strExpression)
{
string returns= DataTables.Compute(strExpression, "true").ToString();
if (returns == null || returns == "") return 0;
else  return DataTables.Compute(strExpression, "true");

}
#endregion //Describe统计

#region rowscopy
//==============PB调用rowscopy实例
//        if l_da2.rowscopy(1, 1, primary!, dw_4, 1, primary!) = -1 then
//    messagebox("提示", "复制处方头失败!")
//end if

//dw_1.rowscopy(1,dw_1.rowcount(),Primary!,dw_2,1,primary!)
//以上语句实现dw_1的数据复制到dw_2中去,从dw_2的第一行开始。

//        语法:
//dwcontrol.RowsCopy (startrow, endrow, copybuffer, targetdw, beforerow,targetbuffer )
//参数:dwcontrol 数据窗口控件名
//startrow long 类型指定要复制的数据行的起始行号
//endrow long 类型指定要复制的数据行的终止行号
//copybuffer dwBuffer 枚举类型,指定从哪个缓冲区中复制行。有效取值为
//Primary! 主缓冲区
//Delete! 删除缓冲区
//Filter! 过滤缓冲区

/// <summary>
/// 把行复制到datatable里,需要注意目标datatable的表结构和源一样
/// 调用实例
///    DataTable dt=dtc.DataTables.Clone();
///    dtc.rowscopy(1, 4, dt);
///   dataGridView2.DataSource = dt;
/// </summary>
/// <param name="startrow">开始行数,遵从pb代码,从1开始</param>
/// <param name="endrow">结束行数,遵从pb代码</param>
/// <param name="dt">目标datatable</param>
/// <returns>1表示复制成功  -1表示复制失败</returns>
public int rowscopy(int startrow,int endrow,DataTable dt)
{
try
{
for (int i = startrow; i < endrow + 1; i++)
{
dt.ImportRow(DataTables.Rows[i - 1]);
}
return 1;
}
catch
{
return -1;
}
}

public int rowscopy(int startrow, int endrow, DataTableChild dt)
{
try
{
for (int i = startrow; i <= endrow+1; i++)
{
dt.DataTables.ImportRow(DataTables.Rows[i - 1]);
}
return 1;
}
catch
{
return -1;
}
}
#endregion //rowscopy

#region reset
public void reset()
{
if(DataTables!=null)
DataTables.Clear();
//DataTables.Reset();
}
#endregion //reset
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: