Avatar billede torotune Nybegynder
02. juli 2006 - 23:43 Der er 9 kommentarer og
1 løsning

Update GridView

Hej,

Jeg har lige et problem med GridView og UpdateDataSource.

Jeg har bundet et gridview til et datasets datatable som trækker alle poster ud fra en tabel.

Men når jeg skal lave en edit og update, virker det kun når alle columns i GridView'et er Visible=True og ReadOnly=True (undtagen lige den første ID-column).

Jeg vil gerne have at nogle columns ikke skal være synlige og/eller ikke editérbare. Men hvis jeg sætter en af dem til visible=false eller/og ReadOnly=False og laver en update, så opdateres rækken alligevel med et "" eller Null. Så går jeg ind i update-sætningen og fjerner "GivneTabel = ?", men herefter vil den slet ikke update nogen columns. Så går jeg ind og fjerner yderligere parameteren for "GivneTabel" og herefter får jeg en fejlmeddelelse:

"ObjectDataSource 'ObjectDatasource1' could not find a non-generic method 'Update' that has parameters: ... "

Mystisk, håber nogen kan hjælpe lidt..
Mvh.
Avatar billede torotune Nybegynder
03. juli 2006 - 15:28 #1
Rettelse: ObjectDataSource og ikke "UpdateDataSource" ;-)
Avatar billede snepnet Nybegynder
04. juli 2006 - 01:17 #2
Kan du ikke vise os din kode?
På din beskrivelse lyder det mere som om du arbejder med en sqldatasource, og ikke en objectdatasource.
Mvh
Avatar billede torotune Nybegynder
07. juli 2006 - 09:40 #3
Ok, der kommer lige et lille eksempel her:

Jeg har en tabel 'VareTabel' som indeholder:
Id, Vare, Kategori, Indkober, Pris, Rating

Det smider jeg i et 'DataSet1' og genererer Select- og Updatecommands
Det binder jeg så via et ObjectDataSource til et GridView.

'Id' er primærnøgle og står i GridView'et pr. default til ReadOnly=True
Herefter virker det fint når jeg laver en update.

Men jeg vil så at:

'Kategori' skal være synlig men ikke opdateres. Den sætter jeg ReadOnly=True
'Indkober' skal være skjult, og egentlig bare opdatere med dens egen værdi.
Den sætter jeg til Visible=False.

Det der sker her er så bare, at hvis jeg laver en update med det, opdaterer den de to kollonner til intet. Hvis jeg fjerner dem fra update-sætningen samt deres parametre får jeg en.

"ObjectDataSource 'ObjectDatasource1' could not find a non-generic method 'Update' that has parameters: ... "

Koden ser således ud:

DataSet1: (Nøjes lige med at poste de to commands)

<SelectCommand>
                  <DbCommand CommandType="Text" ModifiedByUser="True">
                    <CommandText>SELECT Id, Vare, Kategori, Indkober, Pris, Rating
FROM        VareTabel</CommandText>
                    <Parameters>
                    </Parameters>
                  </DbCommand>
                </SelectCommand>
                <UpdateCommand>
                  <DbCommand CommandType="Text" ModifiedByUser="False">
                    <CommandText>UPDATE `VareTabel` SET `Vare` = ?, `Kategori` = ?, `Indkober` = ?, `Pris` = ?, `Rating` = ? WHERE ((`Id` = ?))</CommandText>
                    <Parameters>
                      <Parameter AllowDbNull="True" AutogeneratedName="" DataSourceName="" DbType="String" Direction="Input" ParameterName="Vare" Precision="0" ProviderType="VarWChar" Scale="0" Size="0" SourceColumn="Vare" SourceColumnNullMapping="False" SourceVersion="Current">
                      </Parameter>
                      <Parameter AllowDbNull="True" AutogeneratedName="" DataSourceName="" DbType="Int32" Direction="Input" ParameterName="Kategori" Precision="0" ProviderType="Integer" Scale="0" Size="0" SourceColumn="Kategori" SourceColumnNullMapping="False" SourceVersion="Current">
                      </Parameter>
                      <Parameter AllowDbNull="True" AutogeneratedName="" DataSourceName="" DbType="String" Direction="Input" ParameterName="Indkober" Precision="0" ProviderType="VarWChar" Scale="0" Size="0" SourceColumn="Indkober" SourceColumnNullMapping="False" SourceVersion="Current">
                      </Parameter>
                      <Parameter AllowDbNull="True" AutogeneratedName="" DataSourceName="" DbType="Double" Direction="Input" ParameterName="Pris" Precision="0" ProviderType="Double" Scale="0" Size="0" SourceColumn="Pris" SourceColumnNullMapping="False" SourceVersion="Current">
                      </Parameter>
                      <Parameter AllowDbNull="True" AutogeneratedName="" DataSourceName="" DbType="Int32" Direction="Input" ParameterName="Rating" Precision="0" ProviderType="Integer" Scale="0" Size="0" SourceColumn="Rating" SourceColumnNullMapping="False" SourceVersion="Current">
                      </Parameter>
                      <Parameter AllowDbNull="False" AutogeneratedName="" DataSourceName="" DbType="Int32" Direction="Input" ParameterName="Original_Id" Precision="0" ProviderType="Integer" Scale="0" Size="0" SourceColumn="Id" SourceColumnNullMapping="False" SourceVersion="Original">
                      </Parameter>
                    </Parameters>
                  </DbCommand>
                </UpdateCommand>

I min form, ObjectDataSource1 og GridView:

        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="Id"
            DataSourceID="ObjectDataSource1">
            <Columns>
                <asp:CommandField ShowEditButton="True" />
                <asp:BoundField DataField="Id" HeaderText="Id" InsertVisible="False" ReadOnly="True"
                    SortExpression="Id" />
                <asp:BoundField DataField="Vare" HeaderText="Vare" SortExpression="Vare" />
                <asp:BoundField DataField="Kategori" HeaderText="Kategori" SortExpression="Kategori" ReadOnly="True" />
                <asp:BoundField DataField="Indkober" HeaderText="Indkober" SortExpression="Indkober" Visible="False" />
                <asp:BoundField DataField="Pris" HeaderText="Pris" SortExpression="Pris" />
                <asp:BoundField DataField="Rating" HeaderText="Rating" SortExpression="Rating" />
            </Columns>
        </asp:GridView> 
        <asp:ObjectDataSource ID="ObjectDataSource1" runat="server" DeleteMethod="Delete"
            InsertMethod="Insert" OldValuesParameterFormatString="original_{0}" SelectMethod="GetData"
            TypeName="DataSet1TableAdapters.VareTabelTableAdapter" UpdateMethod="Update">
            <DeleteParameters>
                <asp:Parameter Name="Original_Id" Type="Int32" />
            </DeleteParameters>
            <UpdateParameters>
                <asp:Parameter Name="Vare" Type="String" />
                <asp:Parameter Name="Kategori" Type="Int32" />
                <asp:Parameter Name="Indkober" Type="String" />
                <asp:Parameter Name="Pris" Type="Double" />
                <asp:Parameter Name="Rating" Type="Int32" />
                <asp:Parameter Name="Original_Id" Type="Int32" />
            </UpdateParameters>
            <InsertParameters>
                <asp:Parameter Name="Vare" Type="String" />
                <asp:Parameter Name="Kategori" Type="Int32" />
                <asp:Parameter Name="Indkober" Type="String" />
                <asp:Parameter Name="Pris" Type="Double" />
                <asp:Parameter Name="Rating" Type="Int32" />
            </InsertParameters>
        </asp:ObjectDataSource>

Med venlig hilsen.
Avatar billede snepnet Nybegynder
07. juli 2006 - 13:11 #4
Når du sætter ReadOnly til false medfører det, at værdien holdes ude af det dictionary der der sendes mod din update.
Hvis du angiver feltet under datakeynames vil du kunne sikre at det senders mod metoden alligevel.
Så jeg vil tror at du kan komme igennem sådan her:

<asp:GridView
  ID="GridView1"
  runat="server"
  AutoGenerateColumns="False"
  DataKeyNames="Id,Kategori"
  DataSourceID="ObjectDataSource1">
  <Columns>
    <asp:CommandField ShowEditButton="True" />
    <asp:BoundField DataField="Id" HeaderText="Id" InsertVisible="False" ReadOnly="True" SortExpression="Id" />
    <asp:BoundField DataField="Vare" HeaderText="Vare" SortExpression="Vare" />
    <asp:BoundField DataField="Kategori" HeaderText="Kategori" SortExpression="Kategori" ReadOnly="True" />
    <asp:BoundField DataField="Indkober" HeaderText="Indkober" SortExpression="Indkober" Visible="False" />
    <asp:BoundField DataField="Pris" HeaderText="Pris" SortExpression="Pris" />
    <asp:BoundField DataField="Rating" HeaderText="Rating" SortExpression="Rating" />
  </Columns>
</asp:GridView>

Mvh
Avatar billede torotune Nybegynder
14. juli 2006 - 00:08 #5
Men det er jo fint hvis DataKeyNames sørger for at værdierne bliver bevaret her. Det vil jeg lige prøve.

Alternativt har jeg hidtil gjort at konvertere de columns jeg gerne vil have vist men ikke redigeret til template columns - og så bare udskiftet itemtemplate's textbox med en label så den ikke er mulig at redigere. Men jeg tror dit eksempel vil være noget mere behændigt i længden :-)
Avatar billede snepnet Nybegynder
14. juli 2006 - 12:50 #6
Du kan jo give det et skud, og se om det kan bruges :o)
Mvh
Avatar billede torotune Nybegynder
20. juli 2006 - 10:56 #7
Det ser ud til at virke godt nok når det er ReadOnly, men stadig når en kollonne er visible="false" vil den bruge update-sætningen og update med Null. Måske der burde være en property der hed UpdateVisible tilsvarende InsertVisible?
Avatar billede snepnet Nybegynder
20. juli 2006 - 12:06 #8
Ja - det ville have været en fordel, men du må bare fjerne den fra opdateringsmetoden så.
Mvh
Avatar billede torotune Nybegynder
20. juli 2006 - 12:41 #9
Okay, det må jeg gøre så. Takker for hjælpen. Lægger du et svar :-)
Avatar billede snepnet Nybegynder
20. juli 2006 - 12:43 #10
Kommer her :o)
Mvh
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester