valsil Skrevet 5. oktober 2004 Del Skrevet 5. oktober 2004 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
valsil Skrevet 5. oktober 2004 Forfatter Del Skrevet 5. oktober 2004 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
Kirikiri Skrevet 6. oktober 2004 Del Skrevet 6. oktober 2004 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
valsil Skrevet 6. oktober 2004 Forfatter Del Skrevet 6. oktober 2004 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
Kirikiri Skrevet 7. oktober 2004 Del Skrevet 7. oktober 2004 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
valsil Skrevet 7. oktober 2004 Forfatter Del Skrevet 7. oktober 2004 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 & "]") 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
Kirikiri Skrevet 7. oktober 2004 Del Skrevet 7. oktober 2004 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
valsil Skrevet 7. oktober 2004 Forfatter Del Skrevet 7. oktober 2004 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
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå