自动 SQL DataGrid组件第二部分: 完整的特色版本

分享于 

11分钟阅读

Web开发

  繁體 雙語

介绍

在本系列的第二篇文章中,我们将使我们的ASQLDataGrid 类可以编辑- 即,类可以自动构造它的他SQL语句: 插入 , 更新删除 请检查的第一篇文章,以了解前提。 在详细讨论之前,让我先来介绍一下 ASQLDataGrid 类的一些特性。 首先,虽然我们的ASQLDataGrid 是可以编辑的,但即使该行是刚刚添加到 DataGrid 或者现有行的一行,也只编辑一行。 这个类的第二个特殊特性是,在每个数据行中都有按钮( 编辑和删除),而不是像其他 DataGrid 示例中看到的那样使用超链接。

CmdButtonColumn类

CmdButtonColumn 是我在第一篇文章中显示的CmdButtonDataGrid 列版本。 它有四个 public 属性:

  • Cmd: 执行的命令( 比如: DG_NEWDG_SAVE )。
  • ButtonText: 当行处于视图模式时显示的按钮文本。
  • LabelText: 当行处于编辑模式时显示的标签文本。
  • PreStatement: 执行命令之前执行的JavaScript代码。 它用于在删除行之前添加确认。 在 DataGrid 事件的ItemDataBound 事件中,每个按钮 inside 都附加必要的JavaScript,如以下代码所示:
    protectedoverridevoid OnItemDataBound(DataGridItemEventArgs e)
    {
     base.OnItemDataBound(e);
     if ((e.Item.ItemType == ListItemType.Item) || 
     (e.Item.ItemType == ListItemType.AlternatingItem) || 
     (e.Item.ItemType == ListItemType.SelectedItem))
     {
     for (int i=0; i<Columns.Count;i++)
     {
     if (Columns[i] is CmdButtonColumn)
     {
     CmdButtonColumn column = (CmdButtonColumn)Columns[i];
     ((Button)e.Item.Cells[i].Controls[0]).Attributes.Add(
     "OnClick", column.PreStatement + 
     "__SetCmd('" + column.Cmd + "','" + this.ID + 
     "$" + e.Item.ItemIndex.ToString() + "');"); 
     }
     }
     }
    }

ASQLDataGridCmdExecutor类

与第一篇文章中的版本相比,我们的标准命令执行器将处理一些新命令,如:

  • DG_NEW: 在 DataGrid的顶部添加新行。
  • DG_CANCEL: 取消实际编辑( 用于添加新行或者修改现有行)。
  • DG_SAVE: 保存更改。
  • DG_EDIT: 将一行置于编辑模式。
  • DG_DELETE: 从 DataGrid 中删除一行。

实现非常简单,因为你可以在类的ExecuteCmd 方法中查看详细信息。

ASQLDataGridStatBuilder类

除了第一篇文章中已经提到的BuildSelect 方法之外,我们还将有三种新方法来构建 插入 , 更新删除 语句。让我们先仔细查看 BuildInsert 方法:

publicvirtualstring BuildInsert(ASQLDataGrid dg)
{
 return"insert into" + INS_BuildIntoClause(dg) + 
 INS_BuildListOfColumns(dg) + 
 INS_BuildListOfValues(dg);
}

INS_BuildIntoClause 方法从 DataGrid ID中提取数据库表 NAME,与 BuildSelect 方法中的SEL_BuildFromClause 完全一样。 INS_BuildListOfColumns 以与 SEL_BuildListOfColumns 方法相同的方式返回列的列表。 INS_BuildListOfValues 通过调用 DataGrid 中每个列的GetColumnValue 方法,构建新行( 行号 0 ) 中每个单元的逗号分隔的值列表。 如果列是 BoundColumn,则 GetColumnValue 方法将检查当前单元格是否包含 TextBox 或者仅包含文本。 返回值将是 TextBox的当前文本或者单元格本身的文本:

if (dg.Columns[ColumnIndex] is BoundColumn)
{
 if (dg.Items[RowIndex].Cells[ColumnIndex].HasControls())
 {
 control = 
 dg.Items[RowIndex].Cells[ColumnIndex].Controls[0];
 if (control is TextBox)
 {
 Value = ((TextBox)control).Text;
 }
 }
 else {
 Value = dg.Items[RowIndex].Cells[ColumnIndex].Text;
 }
}

如果列包含或者 CheckBox,则当前方法可以获取单元格的值。 在任何它的他情况下,值将作为空字符串返回,这意味着 BuildInsert 方法将离开该列。 实际上,如果数据库列 NAME 或者它的值作为空字符串返回,那么它将被忽略在语句中。 当然,如果默认行为不是 MATCH,那么你总是可以拥有自己的语句生成器和重写语句的任何部分。

这里的一个重要说明是,值返回"因为"而不进行任何验证或者格式化。 在实际应用程序中,你可能必须在允许 ASQLDataGrid 类自动执行语句之前添加自己的验证和格式设置。

下面是 BuildUpdate 方法的实现方法:

publicvirtualstring BuildUpdate(ASQLDataGrid dg)
{
 string sWhere = UPD_BuildWhereClause(dg);
 if (sWhere.Length == 0)
 {
 //Prevent unintentional update of all the datathrownew Exception("The update statement" + 
 "requires the correct where clause to work with!");
 }
 return"update" + UPD_BuildTableName(dg) + 
 " set" + UPD_BuildSetClause(dg) + 
 UPD_BuildFromClause(dg) + " where" 
 + sWhere;
}

来构造 火警的警铃在哪里? 语句中的 更新 语句,我们需要 ASQLDataGrid的一个新属性: 包含参与数据库表主键的列的索引列表的ListOfPKColumns 字符串。 通常,就像在我们的示例项目中一样,它只是一列,在我们的例子中,我们设置 ListOfPKColumns ="0"UPD_BuildWhereClause 获取 ListOfPKColumns 中的所有列,获取列的'名称和当前值in并返回 火警的警铃在哪里? 类似于以下内容的子句:

PKColName1 = 'CurrentValue1' and PKColName2 = 'CurrentValue2'

为了防止意外更新数据库表中的所有数据,BuildUpdate 将在 UPD_BuildWhereClause 返回空字符串时抛出异常。 UPD_BuildSetClause 方法工作起来非常类似于 UPD_BuildWhereClause,除了它与 ListOfPKColumns 中的所有列都工作。

语句的语法 删除 语句是最简单的。下面是 BuildDelete 方法的外观:

publicvirtualstring BuildDelete(ASQLDataGrid dg, int RowIndex)
{
 string sWhere = DEL_BuildWhereClause(dg, RowIndex);
 if (sWhere.Length == 0)
 {
 //Prevent unintentional delete of all the datathrownew Exception("The delete statement" + 
 "requires the correct where clause" + 
 "to work with!");
 }
 return"delete from" + DEL_BuildFromClause(dg) + 
 " where" + sWhere;
}

DEL_BuildWhereClauseListOfPKColumns 属性一起工作,就像 UPD_BuildWhereClause

示例项目

我们将修改第一篇文章中的示例项目。 首先,我们将 ReportsToBoundColumn 更改为包含 DropDownListTemplateColumn。 在 DataGrid的( 实例级别) ItemDataBound 事件处理程序中填充这里 DropDownList的内容:

privatevoid DG_Employees_ItemDataBound(object sender, 
 System.Web.UI.WebControls.DataGridItemEventArgs e)
{
 if (e.Item.ItemType == ListItemType.EditItem)
 {
 //Populating the DropDownList with the employees' names. . .
 }
}

因为sheet1是数据库引擎中的标识列,所以我们应该指示语句生成器离开该列。 插入 如果在前面的语句中返回一个空字符串,那么它将被忽略:

publicoverridestring GetDBColumnName(TypeOfSQLStatement stat, 
 ASQLDataGrid dg, int ColumnIndex)
{
. . .
 elseif (stat == TypeOfSQLStatement.Insert)
 {
 if (ColumnIndex == 0)
 {
 //Skip the EmployeeID because //it is an identity columnreturn"";
 }
 elsereturnbase.GetDBColumnName(stat, 
 dg, ColumnIndex);
 }
. . .
}

最后,我们应该为 ListOfPKColumns 属性指定正确的值。 作为表键的Employee数据库主键是EmployeeID列,我们设置 ListOfPKColumns="0"

结束语

My auto auto auto auto auto,我用编程语言 written Gupta auto auto,back ( 我的所有学分都归功于 Németh Miklós ) 我的类库including包括我最近的.NET 类库 library。 在你掌握这个想法之前,可以能需要一些时间,希望你会发现我和我的团队是有用的。

快乐和创意编程 !

历史记录

  • 第八个 2005年08月 - 初始版本。

COM  数据  PAR  AUTO  component  版本