Данная статья переведена с помощью средств машинного перевода. Чтобы просмотреть ее на английском языке, установите флажок Английский. Вы также можете просматривать английский текст во всплывающем окне, наводя указатель мыши на переведенный текст.
Перевод
Английский

Свойство ObjectDataSource.DeleteMethod

 

Опубликовано: Октябрь 2016

Возвращает или задает имя метода или функции, ObjectDataSource вызывает элемент управления для удаления данных.

Пространство имен:   System.Web.UI.WebControls
Сборка:  System.Web (в System.Web.dll)

public string DeleteMethod { get; set; }

Значение свойства

Type: System.String

Строка, представляющая имя метода или функции, которая ObjectDataSource используется для удаления данных. Значение по умолчанию — пустая строка ("").

Предполагается, что бизнес-объект, удаление данных по одной записи за раз, а не в пакете.

DeleteMethod Делегирует свойство DeleteMethod свойство ObjectDataSourceView объекта, который связан с ObjectDataSource управления.

Убедитесь, что имена параметров настройки для ObjectDataSource элемента управления DeleteParameters коллекции совпадают с именами столбцов, возвращаемых метод select.

Метод, который определяется параметром DeleteMethod свойство может быть методом экземпляра или static (Shared в Visual Basic) метод. Если это метод экземпляра, бизнес-объект создается и уничтожается при каждом DeleteMethod вызывается свойство. Можно обработать ObjectCreated и ObjectCreating событий для работы с бизнес-объекта перед DeleteMethod вызывается свойство. Можно также обрабатывать ObjectDisposing событие, возникающее после DeleteMethod вызывается свойство. Если бизнес-объект реализует интерфейс IDisposable интерфейс, Dispose метод вызывается перед уничтожением объекта. Если метод является static (Shared в Visual Basic) метод бизнес-объекта не создается и не может обрабатывать ObjectCreated, ObjectCreating, и ObjectDisposing события.

Параметры добавляются в DeleteParameters коллекцию из трех источников:

  • Из элемента управления с привязкой к данным, во время выполнения.

  • Из DeleteParameters элемент, декларативно.

  • Из Deleting метода декларативно.

Во-первых, добавляются любые параметры, которые будут созданы на основе элементов управления с привязкой к данным DeleteParameters коллекции. Например если ObjectDataSource привязан элемент управления GridView управления, который имеет столбцы Name и Number, параметры Name и Number добавляются в коллекцию. Точное имя параметра зависит OldValuesParameterFormatString свойство. Тип данных этих параметров — string. Далее, параметры, которые перечислены в DeleteParameters добавляются элемент. Если параметр в DeleteParameters найден элемент с тем же именем в качестве параметра, который уже присутствует в DeleteParameters коллекции существующий параметр изменяется в соответствии с параметром, который задается в DeleteParameters элемент. Как правило это используется для изменения типа данных в качестве параметра. Наконец, можно программно добавлять и удалять параметры в Deleting событие, которое происходит перед Delete выполнения метода. Метод разрешается после слияния параметров. Разрешение метода рассматривается в следующем разделе.

При Delete вызове метода, поля данных из элемента управления с привязкой к данным, параметры, созданные декларативно в DeleteParameters элемент и параметры, которые были добавлены в Deleting обработчик события будут объединены. (Дополнительные сведения см. в предыдущем разделе.) ObjectDataSource Затем пытается найти метод, вызываемый объект. Во-первых, он ищет один или несколько методов с именем, которая указана в DeleteMethod свойство. Если совпадение не найдено, InvalidOperationException исключение. Если совпадение найдено, он затем ищет совпадение имен. Предположим, например, тип, который задается параметром TypeName свойство имеет два метода с именем DeleteARecord. Один DeleteARecord имеет один параметр ID, а другой DeleteARecord имеет два параметра Name и Number. Если DeleteParameters коллекция имеет только один параметр с именем ID, DeleteARecord метод просто ID именем параметра. При разрешении методов тип параметра не проверяется. Порядок параметров не имеет значения.

Если DataObjectTypeName свойство задано, метод разрешается по-разному. ObjectDataSource Ищет метод с именем, которая указана в DeleteMethod свойство, которое принимает один параметр типа, который указан в DataObjectTypeName свойство. В этом случае имя параметра не имеет значения.

Этот раздел содержит два примера кода. В первом примере кода показано, как использовать ObjectDataSource объект с бизнес-объект и GridView элемент управления для удаления данных. Второй пример кода показывает EmployeeLogic класс, используемый в первом примере кода.

В следующем примере кода демонстрируется использование ObjectDataSource управления с бизнес-объектом и GridView элемент управления для удаления данных. Изначально GridView элемент управления отображает набор всех сотрудников, с помощью метода, который задается параметром SelectMethod свойство для извлечения данных из EmployeeLogic объекта. Поскольку AutoGenerateDeleteButton свойству true, GridView элементов управления автоматически отображает Удаление кнопки.

При нажатии кнопки Удаление кнопки, то операция удаления выполняется с помощью метода, который задается параметром DeleteMethod свойство и любые параметры, заданные в DeleteParameters коллекции. В этом примере кода выполняются также некоторые этапы предварительной и последующей обработки. NorthwindEmployeeDeleting Для обработки вызывается делегат Deleting событий перед выполнением операции и NorthwindEmployeeDeleted вызывается делегат для обработки Deleted событие после завершения операции для выполнения обработки исключений. В этом примере если NorthwindDataException является исключение, оно обрабатывается NorthwindDataException делегат.

<%@ Register TagPrefix="aspSample" Namespace="Samples.AspNet.CS" Assembly="Samples.AspNet.CS" %>
<%@ Import namespace="Samples.AspNet.CS" %>
<%@ Page language="c#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
private void NorthwindEmployeeDeleting(object source, ObjectDataSourceMethodEventArgs e)
{
  // The GridView passes the ID of the employee
  // to be deleted. However, the buisiness object, EmployeeLogic,
  // requires a NorthwindEmployee parameter, named "ne". Create
  // it now and add it to the parameters collection.
  IDictionary paramsFromPage = e.InputParameters;
  if (paramsFromPage["EmpID"] != null) {
    NorthwindEmployee ne
      = new NorthwindEmployee( Int32.Parse(paramsFromPage["EmpID"].ToString()));
    // Remove the old EmpID parameter.
    paramsFromPage.Clear();
    paramsFromPage.Add("ne", ne);
  }
}

private void NorthwindEmployeeDeleted(object source, ObjectDataSourceStatusEventArgs e)
{
  // Handle the Exception if it is a NorthwindDataException
  if (e.Exception != null)
  {

    // Handle the specific exception type. The ObjectDataSource wraps
    // any Exceptions in a TargetInvokationException wrapper, so
    // check the InnerException property for expected Exception types.
    if (e.Exception.InnerException is NorthwindDataException)
    {
      Label1.Text = e.Exception.InnerException.Message;
      // Because the exception is handled, there is
      // no reason to throw it.
      e.ExceptionHandled = true;
    }
  }
}

</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
  <head>
    <title>ObjectDataSource - C# Example</title>
  </head>
  <body>
    <form id="Form1" method="post" runat="server">

        <asp:gridview
          id="GridView1"
          runat="server"
          datasourceid="ObjectDataSource1"
          autogeneratedeletebutton="true"
          autogeneratecolumns="false"
          datakeynames="EmpID">
          <columns>
            <asp:boundfield headertext="EmpID" datafield="EmpID" />
            <asp:boundfield headertext="First Name" datafield="FirstName" />
            <asp:boundfield headertext="Last Name" datafield="LastName" />
          </columns>
        </asp:gridview>

        <asp:objectdatasource
          id="ObjectDataSource1"
          runat="server"
          selectmethod="GetAllEmployees"
          deletemethod="DeleteEmployee"
          ondeleting="NorthwindEmployeeDeleting"
          ondeleted="NorthwindEmployeeDeleted"
          typename="Samples.AspNet.CS.EmployeeLogic">
          <deleteparameters>
            <asp:parameter name="EmpID" type="Int32" />
          </deleteparameters>
        </asp:objectdatasource>

        <asp:label id="Label1" runat="server" />

    </form>
  </body>
</html>

В следующем примере кода показано EmployeeLogic класс, используемый в предыдущем примере кода.

namespace Samples.AspNet.CS {

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Web.UI;
using System.Web.UI.WebControls;
  //
  // EmployeeLogic is a stateless business object that encapsulates
  // the operations you can perform on a NorthwindEmployee object.
  //
  public class EmployeeLogic {

    // Returns a collection of NorthwindEmployee objects.
    public static ICollection GetAllEmployees () {
      ArrayList al = new ArrayList();

      // Use the SqlDataSource class to wrap the
      // ADO.NET code required to query the database.
      ConnectionStringSettings cts = ConfigurationManager.ConnectionStrings["NorthwindConnection"];

      SqlDataSource sds
        = new SqlDataSource(cts.ConnectionString,
                            "SELECT EmployeeID FROM Employees");
      try {
        IEnumerable IDs = sds.Select(DataSourceSelectArguments.Empty);

        // Iterate through the Enumeration and create a
        // NorthwindEmployee object for each ID.
        IEnumerator enumerator = IDs.GetEnumerator();
        while (enumerator.MoveNext()) {
          // The IEnumerable contains DataRowView objects.
          DataRowView row = enumerator.Current as DataRowView;
          string id = row["EmployeeID"].ToString();
          NorthwindEmployee nwe = new NorthwindEmployee(id);
          // Add the NorthwindEmployee object to the collection.
          al.Add(nwe);
        }
      }
      finally {
        // If anything strange happens, clean up.
        sds.Dispose();
      }

      return al;
    }

    public static NorthwindEmployee GetEmployee(object anID) {
      return new NorthwindEmployee(anID);
    }

    public static void DeleteEmployee(NorthwindEmployee ne) {
      bool retval = ne.Delete();
      if (! retval) { throw new NorthwindDataException("Employee delete failed."); }
      // Delete the object in memory.
      ne = null;
    }

    public static void DeleteEmployeeByID(int anID) {
        NorthwindEmployee tempEmp = new NorthwindEmployee(anID);
        DeleteEmployee(tempEmp);
    }
  }

  public class NorthwindEmployee {

    public NorthwindEmployee () {
      ID = DBNull.Value;
      lastName = "";
      firstName = "";
    }

    public NorthwindEmployee (object anID) {
      this.ID = anID;

      ConnectionStringSettings cts = ConfigurationManager.ConnectionStrings["NorthwindConnection"];

      SqlConnection conn = new SqlConnection (cts.ConnectionString);
      SqlCommand sc =
        new SqlCommand(" SELECT FirstName,LastName " +
                       " FROM Employees " +
                       " WHERE EmployeeID = @empId",
                       conn);
      // Add the employee ID parameter and set its value.
      sc.Parameters.Add(new SqlParameter("@empId",SqlDbType.Int)).Value = Int32.Parse(anID.ToString());
      SqlDataReader sdr = null;

      try {
        conn.Open();
        sdr = sc.ExecuteReader();

        // This is not a while loop. It only loops once.
        if (sdr != null && sdr.Read()) {
          // The IEnumerable contains DataRowView objects.
          this.firstName        = sdr["FirstName"].ToString();
          this.lastName         = sdr["LastName"].ToString();
        }
        else {
          throw new NorthwindDataException("Data not loaded for employee id.");
        }
      }
      finally {
        try {
          if (sdr != null) sdr.Close();
          conn.Close();
        }
        catch (SqlException) {
          // Log an event in the Application Event Log.
          throw;
        }
      }
    }

    private object ID;
    public object EmpID {
      get { return ID; }
    }

    private string lastName;
    public string LastName {
      get { return lastName; }
      set { lastName = value; }
    }

    private string firstName;
    public string FirstName {
      get { return firstName; }
      set { firstName = value;  }
    }
    public bool Delete () {
      if (ID.Equals(DBNull.Value)) {
        // The Employee object is not persisted.
        return true;
      }
      else {
        // The Employee object is persisted.
        // Use the SqlDataSource control as a convenient wrapper for
        // the ADO.NET code needed to delete a record from the database.
        ConnectionStringSettings cts = ConfigurationManager.ConnectionStrings["NorthwindConnection"];
        SqlDataSource sds = new SqlDataSource();

        try {
          sds.ConnectionString = cts.ConnectionString;
          sds.DeleteParameters.Add(new Parameter("empID", TypeCode.Int32, this.ID.ToString()));
          sds.DeleteCommand = "DELETE FROM [Order Details] " + 
              "WHERE OrderID IN (SELECT OrderID FROM Orders WHERE EmployeeID=@empID)";
          sds.Delete();
          sds.DeleteCommand = "DELETE FROM Orders WHERE EmployeeID=@empID";
          sds.Delete();
          sds.DeleteCommand = "DELETE FROM EmployeeTerritories WHERE EmployeeID=@empID";
          sds.Delete();
          sds.DeleteCommand = "DELETE FROM Employees WHERE EmployeeID=@empID";
          sds.Delete();
          return true;
        }
        finally {
          // Clean up resources.
          sds.Dispose();
        }
      }
    }
  }

  public class NorthwindDataException: Exception {
    public NorthwindDataException(string msg) : base (msg) { }
  }
}

.NET Framework
Доступно с 2.0
Вернуться в начало
Показ: