在ASP.NET编程中,经常要做就是画一个Form,然后堆砌我们的控件,然后再重复的写一些新增,编辑,更新的重复的工作.事实上,我们大部分时间在做的工作都一样的工作,于是我们就是问:有没有方法在客户机上只要定制好界面[编辑aspx文件,或编辑资源文件]上传文件,然后就可以实现我们要的功能,答案是肯定的.
依照我们的习惯,我们在做数据库编辑的时候,无外乎就要获取可以映射到数据表字段的控件的值,肯定的控件是跟数据表字段是对应的.不管是数据保存和显示时都需要.
问题1:如何映射?
1,要做到数据字段跟控件ID映射,常见的方法不外乎就是:在控件ID上下功夫,在命名控件ID时有字段的影子,可通过数据表字段找到控件,形成映射;或者是通过资源文件约定映射关系,可直接获取数据表字和控件关系.
如:数据表的字段名为:ID,Name,Title时,控件可对应命名为:F_ID,F_Name,F_Title。
2,通XML资源文件定义。
如:Name表名字段名,CtrlId表示控件ID
<Mapper TableName="xS_Self_File" Cname="文件管理">
<Field Name="ID" Type="C" Cname="单号" CtrlId="txt_Fid" CtrlType="Txt" KeyWord="Yes" Value="seq_self_file.NEXTVAL"/>
<Field Name="Title" Type="C" Cname="文件标题" CtrlId="txt_Title" CtrlType="Txt" KeyWord="No"/>
<Field Name="Name" Type="C" Cname="文件名称" CtrlId="txt_FileName" CtrlType="Txt" KeyWord="No"/>
<Field Name="Path" Type="C" Cname="文件路径" CtrlId="txt_FilePath" CtrlType="Txt" KeyWord="No"/>
<Field Name="No" Type="C" Cname="文件编号" CtrlId="txt_FileNo" CtrlType="Txt" KeyWord="No"/>
<Field Name="Source" Type="C" Cname="文件来源" CtrlId="txt_FileSource" CtrlType="Txt" KeyWord="No"/>
<Field Name="Type" Type="C" Cname="文件类型" CtrlId="dll_Type" CtrlType="Dll" KeyWord="No"/>
<Field Name="Stop" Type="C" Cname="是否停用" CtrlId="dll_Stop" CtrlType="Dll" KeyWord="No"/>
<Field Name="Content" Type="C" Cname="文件说明" CtrlId="txt_Content" CtrlType="Txt" KeyWord="No"/>
<Field Name="addby" Type="C" Cname="操作时间" CtrlId="txt_addby" CtrlType="Txt" KeyWord="No"/>
<Field Name="addat" Type="C" Cname="操作人" CtrlId="txt_addat" CtrlType="Txt" KeyWord="No"/>
</Mapper>
问题2:如何获取控件?
1、 如果是通过控件ID来影射时,可以通过遍历[递归]控件容器(如Page,HtmlForm)的子控件,就看我们的控件置身于什么容器下.先搜索到相关录入控件,然后对应数据表字段。
/// <summary>
/// 获取表字段控件,在自定义表单中,控件的命名是:F_字段名
/// 必须定一个控m_Tablename控件,用以存储表名
/// </summary>
public Hashtable GetCtrlList()
{
Hashtable m_ht = new Hashtable();
foreach(Control m_Ctrl in this.Page.Controls)
{
foreach (Control m_tb in m_Ctrl.Controls)
{
// 如果有字控件且不是用户自定义控件,则搜下级控件!
if ( ( m_tb.HasControls() ) &&(!( m_tb is UserControl )))
{
GetCtrlList();
}
else
{
if ( m_tb.ID == null )
{
continue;
}
if ( m_tb.GetType().ToString() == "System.Web.UI.LiteralControl" ) // 如果是空格
{
continue;
}
if ( !m_tb.ID.StartsWith("F_")) // 如果是字段
{
continue;
}
m_ht.Add(m_tb.ID.Replace("F_","").ToLower(),m_tb);
} // EndOf [ if ( ( tb.HasControls() ) &&(!( tb is UserControl )))]
} // End Of Loop For {tb}
} // End Of Loop For {Ctrl}
return m_ht;
}//End Of Function
2、如果是XML,我们就可通控件ID去寻找控件,Page的FindControl()去获取控件和值。
问题3:如何形成SQL语句?
可以根据二种影射关系,SQL的规则进行分拆,研究一下Insert ,Update,Delete,Select 语句。