Pregunta

Tengo un gridview a la que me he creado una plantilla de inserción en la fila de pie de página.

Tengo una ObjectDataSource que está unido a un objeto de negocio.

Tengo un controlador de eventos OnInserting, que nunca es despedido.

El programa encuentra un error, una vez que llamo .Insert en el ObjectDataSource. El error que recibo es que no hay valores y que debería comprobar para asegurarse de que el diccionario de valores no está vacío.

No veo una forma de insertar con un diccionario como un parámetro. He visto mención de agarrar el ObjectDataSourceView y utilizando su método Insert, pero no veo ninguna mención de cómo hacerlo y MSDN afirma que no tiene acceso.

¿Es la reflexión el camino a seguir aquí? ¿Hay una mejor manera de tener una fila de inserción en un gridview? Me estoy perdiendo algo obvio en mis pasos aquí?

A continuación se muestra el código:
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>


Métodos 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;
    }
¿Fue útil?

Solución

Su ejemplo no es consistente ya que tienes DataObjectTypeName set, pero su método de LeasesDS_Inserting es añadir parámetros como si no lo es.

Si usted no necesita DataObjectTypeName, se puede quitar y entonces usted debe tener una mejor oportunidad de conseguir que esto funcione.

Si necesita DataObjectTypeName o simplemente prefiere que (como yo), hay una manera de conseguir que esto funcione, pero no es bastante.

En el método de LeasesGrid_RowCommand, puede utilizar código como este para obtener la vista:

IDataSource ds = (IDataSource)LeasesDS;
DataSourceView view = ds.GetView(LeasesGrid.DataMember);

Después de conseguir el punto de vista, se puede construir un diccionario que contiene los valores que necesitan para que se escriba al objeto de datos que con el tiempo se van pasando a su método Insert. El código para que se verá muy similar a lo que tiene en LeasesDS_Inserting, pero se le inserta en su propio diccionario en lugar de e.InputParameters.

Una vez que tenga listo su diccionario, puede invocar Insertar de la vista con algo como esto:

view.Insert(dict, delegate { return false; });

Eso debería hacerlo.

No será necesario el método LeasesDS_Inserting más desde el punto de vista del método Insert va a hacer el trabajo de convertir el diccionario que se dio en los datos del objeto que va a pasar a su método Insert.

Si necesita hacer más procesamiento de las propiedades de ese objeto de datos, verá que en el diccionario ParámetrosEntrada pasado a LeasesDS_Inserting.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top