Avatar billede jacknet Nybegynder
22. december 2005 - 13:54 Der er 23 kommentarer og
2 løsninger

Editing på GridView

Jeg sidder med et lille GridView, som skaber sig lidt så snart det skal udføre commands.
Trykker jeg fx på "Ret" ud for en række, sker der intet. Trykker jeg igen kommer jeg i editmode. Hvis jeg trykker hist og her på forskellige rækker fucker den helt op.

Her er min kode, håber at nogen kan hjælpe:


Protected Sub gwCategories_RowEditing(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewEditEventArgs) Handles gwCategories.RowEditing
        gwCategories.EditIndex = e.NewEditIndex
    End Sub

Protected Sub gwCategories_RowCancelingEdit(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCancelEditEventArgs) Handles gwCategories.RowCancelingEdit
        gwCategories.EditIndex = -1
    End Sub


<asp:gridview id="gwCategories"
            runat="server"
            autogeneratecolumns="false"
            cssclass="std-grid"
            width="511"
            >
            <alternatingrowstyle backcolor="#f5f5f5" />
            <columns>
                <asp:boundfield headertext="ID" datafield="ID" readonly="true" itemstyle-width="25" />
                <asp:boundfield headertext="Navn" datafield="Name" />
                <asp:commandfield showeditbutton="true" showdeletebutton="true" edittext="Ret" canceltext="Annuller" updatetext="Gem" deletetext="Slet" />
            </columns>
        </asp:gridview>
Avatar billede imago-dei Nybegynder
22. december 2005 - 14:12 #1
Jeg ved ikke om jeg har løsningen på dit problem, men jeg kan ikke rigtig se hvad du laver i dine event-handlere, udover det som sker som default. Prøv at fjerne dine event-handlere helt, og se om ikke koden fungerer fuldt så godt alligevel.

Du har bound fields i din gridwiew, skal du ikke også have en datasource?
Avatar billede jacknet Nybegynder
22. december 2005 - 15:17 #2
Fjerner jeg eventhandlerne, får jeg en exception (The GridView 'gwCategories' fired event RowEditing which wasn't handled.).

Jeg bruger en custom collection som datasource:

With gwDocuments
    .DataSource = o.GetAll
    .DataBind()
End With
Avatar billede snepnet Nybegynder
22. december 2005 - 15:34 #3
hej jacknet ... du skal databinde efter du sætter editindex.
mvh
Avatar billede jacknet Nybegynder
22. december 2005 - 15:54 #4
Hey snepnet,

Jeg skal stadig trykke 2 gange for jeg kommer i editmode...
Avatar billede snepnet Nybegynder
22. december 2005 - 17:17 #5
må jeg se din kode som den er nu?
mvh
Avatar billede jacknet Nybegynder
23. december 2005 - 08:29 #6
Private Sub LoadDocuments() ' Køres også i Page_Load ved ikke-postbacks
        Dim o As New DocumentManager

        With gwDocuments
            .DataSource = o.GetAll
            .DataBind()
        End With
    End Sub

Protected Sub gwCategories_RowCancelingEdit(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCancelEditEventArgs) Handles gwCategories.RowCancelingEdit
        gwCategories.EditIndex = -1
    End Sub

    Protected Sub gwCategories_RowEditing(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewEditEventArgs) Handles gwCategories.RowEditing
        gwCategories.EditIndex = e.NewEditIndex
        Me.LoadDocuments()
    End Sub

<asp:gridview id="gwCategories"
            runat="server"
            autogeneratecolumns="false"
            cssclass="std-grid"
            width="511"
            >
            <alternatingrowstyle backcolor="#f5f5f5" />
            <columns>
                <asp:boundfield headertext="ID" datafield="ID" readonly="true" itemstyle-width="25" />
                <asp:boundfield headertext="Navn" datafield="Name" />
                <asp:commandfield showeditbutton="true" showdeletebutton="true" edittext="Ret" canceltext="Annuller" updatetext="Gem" deletetext="Slet" />
            </columns>
        </asp:gridview>
Avatar billede snepnet Nybegynder
23. december 2005 - 13:06 #7
mm.... forstår jeg egentlig ikke ... prøv at se dette lille eksempel:

// aspx'en
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="true" OnRowEditing="GridView1_RowEditing">
<Columns>
    <asp:CommandField ButtonType="Button" EditText="Edit" ShowEditButton="true"  />
</Columns>
</asp:GridView>

// page_load
protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        Bind();
    }
}

// koden til databinding:
protected void Bind()
{
    List<Person> personer = new List<Person>();
    personer.Add(new Person("Anne", "http://www.google.dk/logos/winter_holiday05_2res.gif"));
    personer.Add(new Person("Hans", "http://www.google.dk/logos/winter_holiday05_2res.gif"));
    personer.Add(new Person("Bente", "http://www.google.dk/logos/winter_holiday05_2res.gif"));

    this.GridView1.DataSource = personer;
    this.GridView1.DataBind();
}

// rowediting
protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
{
    GridView1.EditIndex = e.NewEditIndex;
    Bind();
}

// og så lige personklassen
public class Person
{
    private string _name;
    private string _imageUrl;

    public string ImageUrl
    {
        get { return _imageUrl; }
        set { _imageUrl = value; }
    }

    public string Name
    {
        get { return _name; }
        set { _name = value; }
    }

    public Person(string name, string imageUrl)
    {
        _name = name;
        _imageUrl = imageUrl;
    }
}

det fungerer helt fint ... rækken bliver editerbar når man klikker første gang (men man kan så ikke andet i eksemplet end at sætte en række i editmode).

men noget helt andet... har du prøvet at arbejde med de medfølgende datasourcecontrols?

mvh
Avatar billede jacknet Nybegynder
23. december 2005 - 16:27 #8
Hmm... nej, det er jo ikke anderledes end det jeg gør...

Jeg har ikke brugt de der datasourcecontrols, hvis det er dem man skriver ude i markup'et, du mener. Jeg syntes det er spaghetti-kode om igen at blande SQL statements og markup, og vil for en hver pris undgå det.

Smutter på juleferie nu, håber vi kan gruble videre efter nytår ;)
Avatar billede snepnet Nybegynder
23. december 2005 - 20:01 #9
datasourcecontrols stiller ingen krav om at du skriver din sql-statements i din markup... det er blot én af mulighederne ud af temmelig mange andre.
mvh
Avatar billede imago-dei Nybegynder
24. december 2005 - 15:18 #10
Ja det er korrekt som snepnet siger, du kan f.eks. have både data access layer og business object layer og stadig bruge en datasourcecontrol. Men metoden med at trække en sql datasource ind på en form, skrive sql direkte i datasource controllen osv. er quick and dirty. Og i mange tilfælde kan det sagtens bruges, men det kommer jo meget an på situationen.
Avatar billede jacknet Nybegynder
10. januar 2006 - 08:43 #11
Okay, lyder interessant... Kan man se et eksempel på det i snakker om?
Avatar billede snepnet Nybegynder
10. januar 2006 - 13:54 #12
det kan du tro :

<asp:GridView ID="GridView1" runat="server" DataSourceID="PersonsDataSource" AutoGenerateColumns="False" DataKeyNames="PersonId" AllowSorting="True" AllowPaging="True" PageSize="2">
    <Columns>         
        <asp:CommandField ShowDeleteButton="True" ShowEditButton="True" />
        <asp:BoundField DataField="PersonId" HeaderText="PersonId" SortExpression="PersonId" />
        <asp:BoundField DataField="City" HeaderText="City" SortExpression="City" />
        <asp:BoundField DataField="Country" HeaderText="Country" SortExpression="Country" />
        <asp:BoundField DataField="Adresse" HeaderText="Adresse" SortExpression="Adresse" />
        <asp:BoundField DataField="Age" HeaderText="Age" SortExpression="Age" />
        <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
        <asp:CheckBoxField DataField="IsActive" HeaderText="IsActive" />
    </Columns>
</asp:GridView>
<br />
<asp:ObjectDataSource ID="PersonsDataSource" runat="server" DeleteMethod="DeletePerson" InsertMethod="AddPerson" SelectMethod="GetAllPersons" TypeName="SampleData.PersonAccess" UpdateMethod="UpdatePerson" SortParameterName="sortExpression">
    <DeleteParameters>
        <asp:Parameter Name="personId" Type="Int32" />
    </DeleteParameters>
    <UpdateParameters>
        <asp:Parameter Name="name" Type="String" />
        <asp:Parameter Name="age" Type="Int32" />
        <asp:Parameter Name="adresse" Type="string" />
        <asp:Parameter Name="city" Type="string" />
        <asp:Parameter Name="country" Type="string" />
        <asp:Parameter Name="personId" Type="Int32" />
    </UpdateParameters>
    <InsertParameters>
        <asp:Parameter Name="name" Type="String" />
        <asp:Parameter Name="age" Type="Int32" />
        <asp:Parameter Name="adresse" Type="string" />
        <asp:Parameter Name="city" Type="string" />
        <asp:Parameter Name="country" Type="string" />
    </InsertParameters>
</asp:ObjectDataSource>

Sådan kunne det se ud .... læg mærke til at ObjectDataSource peger på en type:
ypeName="SampleData.PersonAccess"
Hvilket så er den type der holder de metoder der benyttes:

DeleteMethod="DeletePerson"
InsertMethod="AddPerson"
SelectMethod="GetAllPersons"
UpdateMethod="UpdatePerson" 

Desuden  kan du så angive parametre til de forskellige metoder.

Mvh
Avatar billede jacknet Nybegynder
10. januar 2006 - 17:05 #13
Okay, af en eller anden grund har jeg sidder og kigget på AccessDataSource i stdet for ObjectDataSource... hehe.

Jeg får det lige prøvet af i morgen.

Men hvordan passer sorting og paging så ind i den model der?
Avatar billede snepnet Nybegynder
10. januar 2006 - 17:35 #14
sorting er lidt mere "mystisk".... det er noget dit grid direkte vil kunne tilbyde dig - såfremt din datasource tilbyder dig det, hvilket den kan gøre, hvis du indbygger muligheden i dine klasser (eller benytter et dto der er understøttet direkte så som dataset/datatable).

paging kan du sådan set altid få - men det er "den dyre paging", hvor alle data hentes før sortering.

indbygning af sorteringsmuligheder på en klasse meget ukompliceret, og du kan realisere det ved at lave en getmetode der tager et stringbaseret sorteringsudtryk som parameter.

i ovenstående eksemple hentes data med GetAllPersons(), og der er angivet et SortParameterName:
SortParameterName="sortExpression"

og faktisk kan du af det udlede, at der findes en metode på klassen med følgende signatur:
GetAllPersons(string sortExpression);

og sådan kan du altså indbygge understøttelse af sortering på egne typer.... det er ganske anvendeligt, og du skal bare være opmærksom på, at den sortexpression du får angiver direction ved at tilføje " desc" til dit sortexpression.

har du en kolonne i dit grid hvor du har angivet sådan her:
SortExpression="Adresse"
betyder det altså at du får en sortexpression der hedder
"Adresse" når du sorterer den ene vej, og
"Adresse desc" når du sorterer den anden.

selve implementeringen kan du lave meget enkelt (jeg kan sende dig et eksempel hvis du ønsker det).

mvh
Avatar billede jacknet Nybegynder
10. januar 2006 - 17:51 #15
Okay, cool. Jeg ser lige om jeg kan få det op og stå.

Jeg får næppe brug for det i denne omgang, men hvordan ser mulighederne ud mht. custom paging? Har du et link i baghånden til en artikel om det?
Avatar billede snepnet Nybegynder
10. januar 2006 - 18:06 #17
Avatar billede jacknet Nybegynder
06. februar 2006 - 11:29 #18
All right... Nu er det de rigtige rækker der bliver redigerbare.

Nu har jeg følgende:

<asp:objectdatasource
            id="odsCategories"
            runat="server"
            typename="Business.Documentation.DocumentManager"
            selectmethod="GetCategories"
            updatemethod="UpdateCategory"
            >
            <updateparameters>
                <asp:parameter name="id" type="Int32" />
                <asp:parameter name="name" type="string" />
            </updateparameters>
        </asp:objectdatasource>
   
        <asp:gridview
            id="gwCategories"
            runat="server"
            datasourceid="odsCategories"
            autogeneratecolumns="False"
            >
            <columns>
                <asp:boundfield datafield="ID" headertext="ID" sortexpression="ID" readonly="true" />
                <asp:boundfield datafield="Name" headertext="Name" sortexpression="Name"/>
                <asp:commandfield edittext="Ret" updatetext="Gem" canceltext="Annuller" showcancelbutton="true" showeditbutton="true" />
            </columns>
        </asp:gridview>

Af en eller anden grund virker Update-metoden ikke. Der kommer ikke nogen fejl, der sker simpelthen ikke noget.

Jeg har testet min sproc, og derefter prøvet at kalde metoden direkte i page_load, og der virker den fint...
Hvis jeg smider en ny exception i min Update-metode, så bliver den godt nok udløst af mit gridview når jeg prøver at gemme de ændringer jeg har lavet. Altså bliver metoden godt nok kørt...
Avatar billede jacknet Nybegynder
06. februar 2006 - 11:35 #19
Her er min update-metode:

Public Sub UpdateCategory(ByVal id As Integer, ByVal name As String)
            'Throw New Exception("Test")

            Dim spId As New SqlParameter("ID", SqlDbType.Int)
            spId.Value = id

            Dim spName As New SqlParameter("Name", SqlDbType.Char)
            spName.Value = name

            SqlHelper.ExecuteNonQuery(My.Settings.ConnectionString, CommandType.StoredProcedure, _
            "uspUpdateDocumentCategory", spId, spName)
        End Sub
Avatar billede jacknet Nybegynder
06. februar 2006 - 12:01 #20
Arh... hvis jeg fjerner <asp:parameter name="id" type="Int32" />,
og tilføjer datakeynames="ID" på gridview'et, så funker det.

Besynderligt.

Well, tak for hjælpen. Smid et svar.
Avatar billede imago-dei Nybegynder
06. februar 2006 - 12:38 #21
Du behøver ikke fjerne id som parameter i datasourcen. Men alle datakeys er automatisk parametre som bliver bindet til datasourcen. Ligeledes er Name et bound field og du behøver heller ikke sætte det i update eventen. Dermed er det kun nødvendigt med

SqlHelper.ExecuteNonQuery(My.Settings.ConnectionString, CommandType.StoredProcedure, _
            "uspUpdateDocumentCategory", spId, spName)
Avatar billede snepnet Nybegynder
07. februar 2006 - 09:12 #22
hov - det var en gammel en her.... du vil gerne have svar fra os begge to ikke?
mvh
Avatar billede jacknet Nybegynder
07. februar 2006 - 10:30 #23
Ja, det var det, snepnet... Jeg var kommet helt fra det :)

Smid et svar begge to...
Avatar billede imago-dei Nybegynder
07. februar 2006 - 10:52 #24
svar
Avatar billede snepnet Nybegynder
07. februar 2006 - 16:55 #25
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