Сбой при вставке Gridview ObjectDataSource с пустым словарем значений - PullRequest
4 голосов
/ 16 декабря 2008

У меня есть вид сетки, в который я создал шаблон вставки в строке нижнего колонтитула.

У меня есть ObjectDataSource, который связан с бизнес-объектом.

У меня есть обработчик события OnInserting, который никогда не срабатывает.

Программа вызывает ошибку, когда я вызываю .Insert в ObjectDataSource. Я получаю сообщение об ошибке: значения отсутствуют, и я должен убедиться, что словарь значений не пуст.

Я не вижу способа вставить словарь в качестве параметра. Я видел упоминание о захвате ObjectDataSourceView и использовании его метода Insert, но я не вижу упоминаний о том, как это сделать, и MSDN утверждает, что у вас нет доступа.

Отражение - это путь сюда? Есть ли лучший способ иметь строку вставки в сетке? Я упускаю что-то очевидное в моих шагах здесь?

Ниже приведен код:
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>


Методы CodeBehind:

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;
    }

1 Ответ

5 голосов
/ 31 декабря 2008

Ваш пример не соответствует, так как у вас установлено 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.

Если вам нужно больше обработать свойства этого объекта данных, вы увидите это в словаре InputParameters, переданном в LeasesDS_Inserting.

...