Gå til innhold

Datagrid - read only kolonne


Anbefalte innlegg

Det dukker stadig opp spørsmål i for hold til denne datagriden... Denne gangen lurer jeg på hvordan en setter en kolonne til read only?

 

HTML koden for griden ser slik ut.

<asp:datagrid id="dgConstants" style="Z-INDEX: 104; LEFT: 40px; POSITION: absolute; TOP: 176px" runat="server" Width="408px" OnCancelCommand="dgConstants_Cancel" OnUpdateCommand="dgConstants_Update" OnEditCommand="dgConstants_Edit">

<Columns>

<asp:EditCommandColumn ButtonType="PushButton" UpdateText="Update" CancelText="Cancel" EditText="Edit"></asp:EditCommandColumn>

</Columns>

</asp:datagrid>

 

Koden for å fylle datagriden med inh. ser slik ut.

Dim ds As New DataSet

'creating a dataset

ds.Tables.Add(TabConstants)

'adding the table to dataset

dgConstants.DataSource = ds

  'binding the table to datagrid

  dgConstants.DataBind()

  dgConstants.Visible = True

 

'Her har jeg lyst å spesifisere at kolonne 1 skal være enten usynlig eller uleselig.

'Hvis jeg gjør slik:  dgConstants.Columns(0).Visible = False --> forsvinner knottene for å endre (satt inn i html)., men det vil jeg selvsagt ikke. Jeg vil at kolonne 1 skal forsvinne/bli uleselig.  dgConstants.Columns(1).Visible = False

--> Gir følgende feilmelding: Unntaksdetaljer:

 

System.ArgumentOutOfRangeException: Indeksen var ugyldig. Den må ha en positiv verdi, og må være mindre enn samlingens størrelse. Parameternavn: index

 

 

 

Hvis jeg hadde spesifisert de ulike kolonnene i HTML kunne jeg gjort det slik: <asp:BoundColumn DataField="ID" ReadOnly="True" HeaderText="ID"></asp:BoundColumn> Men det er ikke det jeg vil. Jeg vil at feltene skal genereres selv ved hjelp av dataset og heller angi at kolonne 1 skal være read only etterpå.

 

Håper noen kan hjelpe meg litt her ;)

Lenke til kommentar
Videoannonse
Annonse
Det dukker stadig opp spørsmål i for hold til denne datagriden... Denne gangen lurer jeg på hvordan en setter en kolonne til read only?

 

HTML koden for griden ser slik ut.

<asp:datagrid id="dgConstants" style="Z-INDEX: 104; LEFT: 40px; POSITION: absolute; TOP: 176px" runat="server" Width="408px" OnCancelCommand="dgConstants_Cancel" OnUpdateCommand="dgConstants_Update" OnEditCommand="dgConstants_Edit">

<Columns>

<asp:EditCommandColumn ButtonType="PushButton" UpdateText="Update" CancelText="Cancel" EditText="Edit"></asp:EditCommandColumn>

</Columns>

</asp:datagrid>

 

Koden for å fylle datagriden med inh. ser slik ut.

Dim ds As New DataSet

'creating a dataset

ds.Tables.Add(TabConstants)

'adding the table to dataset

dgConstants.DataSource = ds

  'binding the table to datagrid

  dgConstants.DataBind()

  dgConstants.Visible = True

 

'Her har jeg lyst å spesifisere at kolonne 1 skal være enten usynlig eller uleselig.

'Hvis jeg gjør slik:   dgConstants.Columns(0).Visible = False --> forsvinner knottene for å endre (satt inn i html)., men det vil jeg selvsagt ikke. Jeg vil at kolonne 1 skal forsvinne/bli uleselig.   dgConstants.Columns(1).Visible = False

--> Gir følgende feilmelding: Unntaksdetaljer:

 

System.ArgumentOutOfRangeException: Indeksen var ugyldig. Den må ha en positiv verdi, og må være mindre enn samlingens størrelse. Parameternavn: index

 

 

 

Hvis jeg hadde spesifisert de ulike kolonnene i HTML kunne jeg gjort det slik: <asp:BoundColumn DataField="ID" ReadOnly="True" HeaderText="ID"></asp:BoundColumn> Men det er ikke det jeg vil. Jeg vil at feltene skal genereres selv ved hjelp av dataset og heller angi at kolonne 1 skal være read only etterpå.

 

Håper noen kan hjelpe meg litt her ;)

En ting til..

 

Når jeg skriver Response.Write(dgConstants.Columns.Count) får jeg tallet 1 . Selv om jeg kan se at min datagrid har fått mange flere kolonner etter jeg fylte den med inh. fra et dataset, men det blir tydeligvis ikke registrert. Den ene kolonnen er sikkert de edit-knottene jeg setter inn i html koden. Rare greier...

 

Silje

Lenke til kommentar

Det med at antall kolonner kun telles som 1, tror jeg kommer av at tellingen skjer før du rendrer selve datagridden. Så når det telles, så finnes det bare en, de andre kommer etterpå.

 

Får du opp de andre kolonnene? VIlle ha lagt til Autogeneratecolumns=true for datagrid'en, så kommer de opp automatisk, etter knapperekka di.

 

Og knapperekka di er det som har columnindex = 0. I Codebehind (hvis du bruker det), så gjør kolonne(1) usynlig under OnItemDataBound.

 

Et tips til: Bruk forumet på http://www.asp.net/ Der er det masse folk som hjelper deg i løpet av en dag. Du kommer med mange av de samme spørsmålene som jeg har hatt, og jeg har nesten alltid fått svar, eller funnet svarene selv, på det forumet! :)

 

Kirikiri

Lenke til kommentar

God kveld

 

Takk for tips. Jeg har sett litt på den linken du ga meg. Mye god lesning der, men jeg vil likevel spørre deg om en liten ting til siden du er inne i problemstillingen. Du sier jeg kan gjøre kolonne 1 usynlig i OnItemDataBound. Har du et eksempel på hvordan det gjøres?

 

Setter stor pris på din hjelp. Denne datagrid tingen er ikke helt lett å forstå seg på..

 

Silje

Lenke til kommentar

Datagrids er ganske mystiske til du har knekt koden, og etter det er det en drøm å jobbe med. I hvertfall nesten. Opplisting av data blir aldri helt det samme igjen, men det er en del triks man må skjønne først, desverre.

 

Har ikke noe bra løsning foran meg akkurat nå, så har ikke fått testet denne koden. Men jeg tror dette kan være en veiviser for deg:

 

   Private Sub dgrTest_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataGridItemEventArgs) Handles dgrTest.ItemDataBound
       Dim i As Integer
      If e.Item.ItemType = ListItemType.Header 
           For i = 0 To dgrTest.Columns.Count
               If dgrTest.Columns(i).HeaderText = "test" Then
                   dgrTest.Columns(i).Visible = False
               End If
           Next
       End If
   End Sub

 

Bytt ut sjekken om headertext med det som skal være headertext i din løsning, og se om det funker.

 

Annen webside det kan lønne seg å sjekke ut:

http://www.datagridgirl.com/

Hun skriver nesten bare om datagrids. :)

 

Kirikiri

Lenke til kommentar

Hei igjen...

 

Nå har jeg vært inne på den linken til det forumet du snakket om og funnet noe greier slik at jeg får til å skjule kolonnen med header ID, men nå får jeg ikke til å få tak i de andre kolonnene lengre...

 

i HTml koden har jeg satt autogeneratecolumns="False"

 

Resten av vesentlig HTML kode

 

<asp:DataGrid id="dgConstants" style="Z-INDEX: 101; LEFT: 128px; POSITION: absolute; TOP: 200px"

runat="server" Width="672px" Height="264px" AutoGenerateColumns="False" OnEditCommand="dgConstants_Edit"

OnUpdateCommand="dgConstants_Update" OnCancelCommand="dgConstants_Cancel">

<Columns>

<asp:EditCommandColumn ButtonType="PushButton" UpdateText="Update" CancelText="Cancel" EditText="Edit"></asp:EditCommandColumn>

<asp:BoundColumn DataField="ID" ReadOnly="True" HeaderText="ID"></asp:BoundColumn>

</Columns>

</asp:DataGrid>

 

Kode for å fylle datagriden ser slik ut:

If TabConstants.Rows.Count > 0 Then

                    Response.Write(TabConstants.Rows.Count)

 

                    Dim bc As BoundColumn

                    For Each col As DataColumn In TabConstants.Columns

                        bc = New BoundColumn

                        bc.HeaderText = col.ColumnName

                        bc.DataField = col.ColumnName

                        Me.dgConstants.Columns.Add(bc)

                    Next

                    Me.dgConstants.Visible = True

 

                    Dim ds As New DataSet

                    ds = New DataSet

                    'creating a dataset

 

                    ds.Tables.Add(TabConstants)

                    'adding the table to dataset

                    dgConstants.DataSource = ds

                    'binding the table to datagrid

                    dgConstants.DataBind()

                    dgConstants.Columns(1).Visible = False

                    dgConstants.Columns(2).Visible = False

 

                    ' dgConstants.Columns(3).Visible = False

 

 

                    dgConstants.Visible = True

 

                End If

            End If

 

Funker fint helt til jeg vil editere kolonner...

 

Sub dgConstants_Update(ByVal sender As Object, ByVal e As DataGridCommandEventArgs)

''Read in the values of the updated row

       

Dim i As Integer

Dim columnValue As String

 

'xDocConstants.Load("c:\mmconstantsxml_2.xml")

 

xDocConstants.Load(HttpContext.Current.Request.PhysicalApplicationPath & "mmconstantsxml_3.xml")

 

        If Not xDocConstants Is Nothing Then

            Dim xElmStory As XmlElement = xDocConstants.CreateElement("tmp")

            'henter ut story fra manusxml dokumentet

 

            If Not xDocConstants Is Nothing Then

 

                'Har lagt inn et sjult felt som inneholder ID. Dette fordi jeg vil hente ID fra et felt som ikke bruker har mulighet

                'til å editere. Bør egentlig sjule raden med editerbare ID`er...

                Dim strID = e.Item.Cells(1).Text

                'dgConstants.Columns(1).Visible = True

 

                '  Dim tmpTest = e.Item.Cells(3).Text 'CType(e.Item.Cells(2).Controls(0), TextBox).Text()

                'tmpTest = CType(e.Item.Cells(3).Controls(0), TextBox).Text()

                'tmpTest = CType(e.Item.Cells(4).Controls(0), TextBox).Text()

                'tmpTest = CType(e.Item.Cells(5).Controls(0), TextBox).Text()

 

                'dgConstants.Columns(1).Visible = False

 

 

                'Dim strID As String = CType(e.Item.Cells(1).Controls(0), TextBox).Text()

 

                xElmStory = xDocConstants.SelectSingleNode("mmConstants/channelConfig/channels/channel[@ID=" & strID & &quot]")

 

If Not xElmStory Is Nothing Then

 

For i = 0 To dgConstants.Columns.Count - 1 'minus 2 siden 2 første kolonner ikke teller med

 

columnValue = CType(e.Item.Cells(i).Controls(0), TextBox).Text()

xElmStory.SetAttribute(dgConstants.Columns(i).HeaderText.ToString().ToLower, columnValue)

 

Next

 

 

'xDocConstants.Save("c:\mmconstantsxml_2.xml")

xDocConstants.Save(HttpContext.Current.Request.PhysicalApplicationPath & "mmconstantsxml_3.xml")

'Finally, set the EditItemIndex to -1 and rebind the DataGrid

 

dgConstants.EditItemIndex = -1

 

'Gjør endringer i XMl dokumentet og lagre det.

 

  'Denne funksjonen vil lese XML dokumentet på ny og laste det.

BindData()

End If

End If

End If

End Sub

 

 

Følgende feilmelding: Unntaksdetaljer: System.InvalidCastException: Ugyldig rolle angitt.

 

Kildefeil:

 

Linje 83: For i = 0 To dgConstants.Columns.Count - 1 'minus 2 siden 2 første kolonner ikke teller med

Linje 84:

Linje 85: columnValue = CType(e.Item.Cells(i).Controls(0), TextBox).Text()

Linje 86: xElmStory.SetAttribute(dgConstants.Columns(i).HeaderText.ToString().ToLower, columnValue)

Linje 87:

 

Det vil si at jeg ikke får tak i de kolonnene lengre....

 

 

Da jeg kjørte din kode fikk jeg følgende feilmelding: System.ArgumentOutOfRangeException: Indeksen var ugyldig. Den må ha en positiv verdi, og må være mindre enn samlingens størrelse. Parameternavn: index

 

Kildefeil:

 

 

Linje 29: If e.Item.ItemType = ListItemType.Header Then

Linje 30: For i = 0 To dgConstants.Columns.Count

Linje 31: If dgConstants.Columns(i).HeaderText = "ID" Then

Linje 32: dgConstants.Columns(i).Visible = False

Linje 33: End If

Lenke til kommentar

Prøv å gjøre om eksempelet mitt til å også sjekke om det er edititem, dvs:

 

Private Sub dgrTest_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataGridItemEventArgs) Handles dgrTest.ItemDataBound
       Dim i As Integer
       If e.Item.ItemType = ListItemType.EditItem Then


'HER GJØR DU SJEKK PÅ EVT. TING DU VIL SJEKKE,


       ElseIf e.Item.ItemType = ListItemType.Header Then
           For i = 0 To dgrTest.Columns.Count
               If dgrTest.Columns(i).HeaderText = "test" Then
                   dgrTest.Columns(i).Visible = False
               End If
           Next
       End If
   End Sub

 

-tror jeg.

Har ikke jobbet mot XML-filer før, pleier å jobbe direkte med SQL, og da ser koden annerledes ut.

 

Kirikiri

Lenke til kommentar

Hei

 

Jeg tror ikke det spiller noen rolle hvilken datakilde en benytter. Jeg henter ut dataene fra XMl i et datasett og videre behandling vil nok bli lik.

 

Når jeg bruker ditt eksempel + kode som vist i mitt første innlegg i denne diskusjonen.

 

Private Sub dgConstants_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataGridItemEventArgs) Handles dgConstants.ItemDataBound

        Dim i As Integer

        If e.Item.ItemType = ListItemType.Header Then

            For i = 0 To dgConstants.Columns.Count

                If dgConstants.Columns(i).HeaderText = "ID" Then

                    dgConstants.Columns(i).Visible = False

                End If

            Next

        End If

    End Sub

 

får jeg følgende feilmelding:

 

Kildefeil:

 

Linje 29: If e.Item.ItemType = ListItemType.Header Then

Linje 30: For i = 0 To dgConstants.Columns.Count

Linje 31: If dgConstants.Columns(i).HeaderText = "ID" Then

Linje 32: dgConstants.Columns(i).Visible = False

Linje 33: End If

 

Rare greier. Det er et eller annet jeg glemmer, men hva...

Fikk nesten samme feilmelding som da jeg benyttet kode som vist i mitt forrige innlegg. Der klarte jeg å skjule kolonnen jeg ville, men fikk problemer da jeg skulle hente ut verdiene som er endret. (kunne ha sendt deg all koden på mail hvis du hadde hatt interesse av det.)

 

Silje

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...