Ошибка вставки ObjectDataSource Gridview Без словаря пустых значений
-
21-08-2019 - |
Вопрос
У меня есть gridview, для которого я создал шаблон вставки в строку нижнего колонтитула.
У меня есть ObjectDataSource, который привязан к бизнес-объекту.
У меня есть обработчик событий OnInserting, который никогда не запускается.
Программа выдает ошибку после моего вызова.Вставьте в ObjectDataSource.Ошибка, которую я получаю, заключается в том, что нет значений и что я должен проверить, чтобы убедиться, что словарь значений не пуст.
Я не вижу способа вставить со словарем в качестве параметра.Я видел упоминание о захвате ObjectDataSourceView и использовании его метода Insert, но я не вижу никаких упоминаний о том, как это сделать, и MSDN утверждает, что у вас нет доступа.
Является ли рефлексия способом, которым нужно идти здесь?Есть ли лучший способ вставить строку в gridview?Я упускаю что-то очевидное в своих действиях здесь?
Ниже приведен код:
ObjectDataSource Объект - источник данных:
<asp:ObjectDataSource ID="LeasesDS" runat="server" OnInserting="LeasesDS_Inserting"
DataObjectTypeName="CLS.BusObjects.LeaseObj" DeleteMethod="Delete"
InsertMethod="Insert" OldValuesParameterFormatString="original_{0}"
SelectMethod="GetLeasesByCustomerID" TypeName="CLS.BusObjects.LeaseObj"
UpdateMethod="Update">
<SelectParameters>
<asp:Parameter Name="customerID" Type="Int32" />
</SelectParameters>
<InsertParameters>
<asp:Parameter Name="CustomerID" Type="Int32" />
<asp:Parameter Name="PurchaseDate" Type="DateTime" />
<asp:Parameter Name="AutoYear" Type="Int32" />
<asp:Parameter Name="Make" Type="String" />
<asp:Parameter Name="Model" Type="String" />
<asp:Parameter Name="LeaseEndDate" Type="DateTime" />
</InsertParameters>
</asp:ObjectDataSource>
Методы , связанные с кодом:
protected void LeasesGrid_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == "Insert" && Page.IsValid)
{
LeasesDS.Insert();
}
}
protected void LeasesDS_Inserting(object sender, ObjectDataSourceMethodEventArgs e)
{
DropDownList GridCustomersList = (DropDownList)LeasesGrid.FooterRow.FindControl("GridCustomersList");
TextBox PurchaseDate = (TextBox)LeasesGrid.FooterRow.FindControl("PurchaseDate");
TextBox AutoYear = (TextBox)LeasesGrid.FooterRow.FindControl("AutoYear");
TextBox Make = (TextBox)LeasesGrid.FooterRow.FindControl("Make");
TextBox Model = (TextBox)LeasesGrid.FooterRow.FindControl("Model");
TextBox LeaseEndDate = (TextBox)LeasesGrid.FooterRow.FindControl("LeaseEndDate");
e.InputParameters["CustomerID"] = Convert.ToInt32(GridCustomersList.SelectedValue);
DateTime? purchaseDate = null;
if (!string.IsNullOrEmpty(PurchaseDate.Text)) purchaseDate = Convert.ToDateTime(PurchaseDate.Text);
e.InputParameters["PurchaseDate"] = purchaseDate;
int? autoYear = null;
if (!string.IsNullOrEmpty(AutoYear.Text)) autoYear = Convert.ToInt32(AutoYear.Text);
e.InputParameters["AutoYear"] = autoYear;
string make = null;
if (!string.IsNullOrEmpty(Make.Text)) make = Make.Text;
e.InputParameters["Make"] = make;
string model = null;
if (!string.IsNullOrEmpty(Model.Text)) model = Model.Text;
e.InputParameters["Model"] = model;
DateTime? leaseEndDate = null;
if (!string.IsNullOrEmpty(LeaseEndDate.Text)) leaseEndDate = Convert.ToDateTime(LeaseEndDate.Text);
e.InputParameters["LeaseEndDate"] = leaseEndDate;
}
Решение
Ваш пример не соответствует, поскольку у вас установлен DataObjectTypeName , но ваш метод LeasesDS_Inserting добавляет параметры, как будто это не так.
Если вам не нужен DataObjectTypeName, вы можете удалить его, и тогда у вас будет больше шансов заставить это работать.
Если вам нужен DataObjectTypeName или вы просто предпочитаете его (как это делаю я), есть способ заставить это работать, но это некрасиво.
В вашем методе LeasesGrid_RowCommand вы можете использовать подобный код для получения представления:
IDataSource ds = (IDataSource)LeasesDS;
DataSourceView view = ds.GetView(LeasesGrid.DataMember);
После получения представления вы можете создать словарь, содержащий значения, которые необходимо записать в объект данных, который в конечном итоге будет передан вашему методу Insert.Код для этого будет выглядеть очень похоже на то, что у вас есть в LeasesDS_Inserting , но вы будете вставлять в свой собственный словарь вместо e.InputParameters .
Как только у вас будет готов словарь, вы можете вызвать Insert в представлении с помощью чего-то вроде этого:
view.Insert(dict, delegate { return false; });
Этого должно хватить.
Вам больше не понадобится метод LeasesDS_Inserting, поскольку метод Insert представления выполнит работу по преобразованию предоставленного вами словаря в объект данных, который он собирается передать вашему методу Insert.
Если вам нужно выполнить дополнительную обработку свойств этого объекта данных, вы увидите это в словаре входных параметров, переданном в LeasesDS_Inserting .