数据窗口的种类 -卡片类。
数据来源 :
A卡片对应一条记录,每个控件对应记录中的一个字段。
B 卡片对应多条记录。每个控件对应一条记录中的某个字段。
对于第一种情况,只需要设置控件的DATABINDINGS属性就可以了.
具体代码如下 :
this.btnEdit_Y_DYKM.DataBindings.CLEAR .
this.btnEdit_Y_DYKM.DataBindings.Add("要绑定的属性", DS_CurRecodr.Tables[0].DefaultView, "对应的字段名称").
对于第二种情况 。
-
需要首先把行转化为列 。具体的代码 :
- #region //列转化为行。 RecordingRulesDs 到 dt ,dt有切仅有一条数据。
- // 创建dt 的结构;
- string columName = "'GTJSYHSKPZLX','GTJSYHFKPZLX','GTJSYHSKZDFH', "
- + "'GTJSZYFJZPZLX','GTJSZYFJZHSKM','GTJSZYFJZZDFH','GTJSDQCRPZLX','GTJSDQCRZDFH','GTJSDQZQPZLX', "
- + "'GTJSDQZQZYFPZLX','GTJSDQZQDQLXHSKM','GTJSDQZQHQLXHSKM','GTJSDQZQZDFH' , 'GTJSDQZQZDPZ','GTJSDQCRZDPZ'";
- columName = columName.Replace("'", "");
- String[] columNameList = columName.Split(',');
- dt.Rows.Clear();
- dt.Columns.Clear();
- foreach (string str in columNameList)
- {
- DataColumn dc = new DataColumn();
- dc.ColumnName = str.Trim();
- dt.Columns.Add(dc);
- }
- //dt里面添加数据。
- dt.Rows.Clear();
- string[] numberValues ={ " ", " ", "0", " ", " ", "0", " ", "0", " ", " ", " ", " ", "0", "1", "1" };
- dt.Rows.Add(numberValues);
- //更具RecordingRulesDs 修改dt里面的数据
- if (RecordingRulesDs.Tables[0].Rows.Count > 0)
- {
- foreach (string str in columNameList)
- {
- DataRow[] DTR = RecordingRulesDs.Tables[0].Select(" F_JGNM = '" + this.UserInfo.JGNM.Trim() + "' AND F_VKEY = '" + str.Trim() + "'");
- if (DTR.Length == 1)
- {
- string columValue = DTR[0]["F_VALUE"].ToString().Trim();
- dt.Rows[0][str.Trim()] = columValue;
- }
- }
- }
- dtEx = dt.Copy();
- dt.AcceptChanges();
- dtEx.AcceptChanges();
-
#endregion
然后重复第一种情况 把字段和空间关联起来,就可以控制读写了。
判断卡片中的数据是否改变有两种方法。
使用两个
dataset 。此种情况是比较成熟的方案
。
-
使用步骤程序中定义一个全局的窗体datasest变量 。UIDS_OLD ,和 UIDS .
-
窗体load时把UIDS填充数据。同时UIDS_OLD = UIDS.COPY() ;
需要判断界面数据是否改变时比较两个DS数据是否一致、具体代码为: ///
/// DataSet和原始的DataSet相比较,是否被修改了。
///
/// 原始DataSet
/// 要比较的DataSet
///
public static string IfDataSetHasChanges(DataSet dsInit, DataSet ds)
{
string vsRtn = "";
if ((ds == null) || (dsInit == null))
{
return vsRtn;
}
int countInit = dsInit.Tables.Count;
int count = ds.Tables.Count;
if (countInit != count)
{
vsRtn = "HasChanges";
return vsRtn;
}
int tblIndex = 0;
DataTable tblInit = null;
foreach (DataTable tbl in ds.Tables)
{
tblInit = dsInit.Tables[tblIndex];
vsRtn = IfDataTableHasChanges(tblInit, tbl);
if (vsRtn != "")
break;
tblIndex++;
}
return vsRtn;
}
///
/// DataSet和原始的DataSet相比较,是否被修改了。
///
/// 原始DataSet
/// 要比较的DataSet
///
public static bool DataSetHasChanges(DataSet dsInit, DataSet ds)
{
if (string.IsNullOrEmpty(IfDataSetHasChanges(dsInit, ds)))
return false;
else
return true;
}
///
/// 判断DataTable是否变化了,和原始的DataTable相比较
///
/// 原始的DataTable
/// 要比较的DataTable
///
public static string IfDataTableHasChanges(DataTable tblInit, DataTable tbl)
{
string vsRtn = "";
if (((tbl == null) && (tblInit != null)) || ((tbl != null) && (tblInit == null)))
{
vsRtn = "HasChanges";
return vsRtn;
}
int colCount = tblInit.Columns.Count;
int Count = tbl.Columns.Count;
if (colCount != Count)//判断了是否相同
{
vsRtn = "HasChanges";
return vsRtn;
}
int rowCount = tblInit.Rows.Count;//判断行是否相同
Count = tbl.Rows.Count;
if (rowCount != Count)
{
vsRtn = "HasChanges";
return vsRtn;
}
int rowIndex = 0;
DataRow rowInit = null;
foreach (DataRow row in tbl.Rows)
{
rowInit = tblInit.Rows[rowIndex];
if (row.RowState == DataRowState.Deleted)
{
vsRtn = "HasChanges";
break;
}
if (vsRtn != "")
break;
for (int colIndex = 0; colIndex < colCount; colIndex++)
{
if (tblInit.Columns[colIndex].DataType.Name.ToUpper() == "DOUBLE" || tblInit.Columns[colIndex].DataType.Name.ToUpper() == "FLOAT" || tblInit.Columns[colIndex].DataType.Name.ToUpper() == "DECIMAL")
{
if (string.IsNullOrEmpty(Convert.ToString(rowInit[colIndex])) || string.IsNullOrEmpty(Convert.ToString(row[colIndex])))
{
if (Convert.ToString(rowInit[colIndex]) != Convert.ToString(row[colIndex]))
{
vsRtn = "HasChanges";
break;
}
}
else
{
if (Math.Round(Convert.ToDouble(rowInit[colIndex]), 5) != Math.Round(Convert.ToDouble(row[colIndex]), 5))
{
vsRtn = "HasChanges";
break;
}
}
}
else
if (Convert.ToString(rowInit[colIndex]) != Convert.ToString(row[colIndex]))
{
vsRtn = "HasChanges";
break;
}
}
rowIndex++;
}
return vsRtn;
}
-
更具需要把决定下一步操作。
使用一个dataset 。
利用dataset自己的属性控制数据是否改变以及对数据如何处理。
备注 :
1) 使用form展现dataset数据是通过databindings 属性来实现的,但是如果操作过程中重复获取数据,那么就有可能导致form和dataset之间的关联丧失。界面数据展现的就是dataset当前行的记录。针对此种情况的处理方式 :
-
UIDS.TABLE[0].ROWS.CLEAR ;
UIDS.TABLE[0].ROWS.ADD(UIDS_NEW.TABLE[0].ROWS) ;
-
如果直接用UIDS获取数据。
UIDS = getdata() ;