Pergunta

Eu tenho um gridview em que eu criei um modelo de inserção na linha de rodapé.

Eu tenho um ObjectDataSource que é vinculado a um objeto de negócios.

Eu tenho um manipulador de eventos OnInserting o que nunca é demitido.

O programa encontra um erro, uma vez que eu chamo .Colocar no ObjectDataSource. O erro que recebo é que não existem valores e que eu deveria verificar para certificar-se o dicionário valores não está vazia.

Eu não vejo uma maneira de inserir com um dicionário como um parâmetro. Eu vi menção de pegar o ObjectDataSourceView e usá-lo de método Insert, mas eu não vejo qualquer menção de como fazer isso e MSDN afirma que você não tem acesso.

É reflexão o caminho a percorrer aqui? Existe uma maneira melhor de ter uma linha de inserção em um gridview? Estou faltando alguma coisa óbvia em meus passos aqui?

Abaixo está o 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;
    }
Foi útil?

Solução

Seu exemplo não é consistente desde que você tem DataObjectTypeName set, mas o seu método LeasesDS_Inserting é adicionando parâmetros como se não é.

Se você não precisa DataObjectTypeName, você pode removê-lo e, em seguida, você deve ter uma melhor chance de começar este trabalho.

Se precisar DataObjectTypeName ou simplesmente preferem-lo (como eu), há uma maneira de chegar a este trabalho, mas não é bonito.

No seu método de LeasesGrid_RowCommand, você pode usar um código como este para obter a vista:

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

Depois de obter o ponto de vista, você pode construir um dicionário contendo os valores que precisam ser gravados no objeto de dados que acabará por se passado para o método Insert. O código para que vai olhar muito semelhante ao que você tem em LeasesDS_Inserting, mas você estará inserindo em seu próprio dicionário em vez de e.InputParameters.

Depois de ter seu dicionário pronto, você pode invocar Inserir na vista com algo parecido com isto:

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

Isso deve fazê-lo.

Você não vai precisar o método LeasesDS_Inserting mais uma vez Insert método da vista vai fazer o trabalho de converter o dicionário que você deu para o objeto de dados que ele vai passar para o seu método de Inserção.

Se você precisar de fazer mais processamento das propriedades nesse objeto de dados, você vai vê-lo nas ParâmetrosDeEntrada dicionário passado para LeasesDS_Inserting.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top