19. maj 2005 - 15:39Der er
71 kommentarer og 1 løsning
Variabel tekst i datagrid ?
Hejsa,
Jeg sidder og roder med at få lavet et datagrid hvor teksten på en linkbutton skal være variabel udfra hvilket sprog den enkelte bruger har valgt. Men det lader ikke til at jeg bare lige kan gøre det.
Nogen der har ideer til hvordan man gør og gerne fra codebehind ?
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
i code-behind kunne du abbonnere på itemdatabound på griddet, og lave en LinkButton lbtn = (LinkButton)e.Item.FindControl("lbtnEdit"); lbtn.Text = GetText(...);
men ..... hvis du skal understøtte flere sprog, synes jeg du skal bruge de indbyggede muligheder for den slags, hvor du igennem en resourcemanager henter det du skal bruge. (fall-back til defaultværdier er direkte understøttet).
Jeg har lavet en xml fil for hvert sprog siden skal kunne vises i og med en function som så hiver de ønskede oplysninger ud jeg skal bruge til diverse labels, buttons, links, datagrids osv. Så din function :
det siger vi bare :o) - du skriver bare hvis der er noget (så er det muligt, omænd langtfra sikker lige i øjeblikket, at jeg får en mail og ser det :o) /snep
hmm... er ikke helt med på at den klart ikke vil acceptere det i et datagrid... det er der ingen problemer i - det er det skam bygget til.
Text='<%# GetText("TXT_EDIT") %>' er også fint gangbar i det eksempel du selv skrev med en hyperlinkcolumn, og ligeledes vil det gå fint med HeaderText i din boundcolumn.
det eksempel jeg sendte dig var baseret på en templatecolumn, som er at foretrække for fuld kontrol over de kontroller du indsætter mv.
(men .... jeg synes som sagt at du skal bruge templates når du gerne vil arbejde med kontroller fra koden - det er noget nemmere/sikrere at få fat i de enkelte kontroller i dine items) mvh
og for øvrigt ... dine headertekster kan du sætte kolonnevis fra koden sådan her : someGrid.Columns[<index>].HeaderText = <hvordan du nu skaffer teksten>; mvh
Jeg har lige forsøgt mig med følgende (arbejder i vb.net) :
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'Put user code to initialize the page here If Not IsPostBack Then BindGrid() End If End Sub
Private Sub BindGrid() Dim objConn As System.Data.SqlClient.SqlConnection = DbClass.SqlConnect Dim objComm As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand("Select NewsId, Headline, TheDate From tbl_news Order By NewsId", objConn) Dim objDataAdapter As System.Data.SqlClient.SqlDataAdapter = New System.Data.SqlClient.SqlDataAdapter objDataAdapter.SelectCommand = objComm Dim objDataSet As DataSet = New DataSet objDataAdapter.Fill(objDataSet, "tbl_news")
Dim someLinkButton As LinkButton = New LinkButton someLinkButton.Text = Util.GetLocalizedString("newslistone") End Sub
Men så viser den ikke nogen linkbutton ? Min GetLocalizedString ser ud som følgende :
Public Shared Function GetLocalizedString(ByVal type As String) As String Dim ses As String = CType(HttpContext.Current.Session("setLanguage"), String)
If HttpContext.Current.Cache("LoginLanguage" + ses) Is Nothing Then Dim ds As DataSet = New DataSet ds.ReadXml(HttpContext.Current.Server.MapPath("/try2try/Xml/" & ses & ".xml"))
Dim depends As New _ System.Web.Caching.CacheDependency _ (HttpContext.Current.Server.MapPath("/try2try/Xml/" & ses & ".xml"))
HttpContext.Current.Cache.Insert("LoginLanguage" + ses, ds, depends) End If
Return CType(HttpContext.Current.Cache("LoginLanguage" + ses), DataSet).Tables(0).Rows(0)(type).ToString() End Function
Og ligger i en seperat class fil sammen med andre functioner jeg bruger. Hvis jeg skriver '<%# Util.GetLocalizedString("newslistone")%>' Text i linkbutton får jeg denne fejl :
Compiler Error Message: BC30456: 'GetLocalizedString' is not a member of 'Util'.
og det passer ikke for min class hedder Util, men det bedste ville også være at ordne det i codebehind
og sidst men ikke mindst så viser den alt i datagridet :
hvis du i html'en har indsat en linkbutton : <asp:LinkButton id="someLinkButton" runat="server"></asp:LinkButton>
kan du bare lave en deklaration i koden : protected LinkButton someLinkButton; (husk at angive samme navn som er angivet i id i html'en) visual studio sørger normalt for den slags.
så klarer frameworket det med at lave en new, og du kan så bare arbejde med din LinkButton som du vil.
først.... har du checket at din label er angivet med id="someLinkButton" i din aspxfil ?
du kan godt lægge metodekaldet i page_load - det er fint nok.
du kan altid debugge ned igennem din kode, og se hvordan den afvikles, og hvad der eventuelt fejler.
du sætter et breakpoint ved at stille curseren på den linie du gerne vil have eksekveringen stopper på, og trykker på F5 for at starte applikationen. med standardopsætning vil eksekveringen stoppe på den linie du har sat breakpoint på, og du kan så afvikle en linie ad gangen ved at trykke F10. (ved ikke om shortcutsne er anderledes når du arbejde i VB - men du kan kigge i debug-menuen... der står de).
mens du debugger kan du inspicere variable mv - blot ved at holde musen over dem.
Der sker ikke så meget når jeg køre debug skal der ikke sættes noget i web.config for at det virker ? Den loader blot min default.aspx side og så sker der ikke mere ?
prøv at sæt et breakpoint i page_load i din codebehind for default.aspx ? og så skal du checke at din aktive konfiguration er debug (det burde stå i en dropdownlist oppe i menuen... hvis der står release skal du ændre til debug). mvh
du kan højreklikke på filen, og trykke på "set as startpage" - så starter den der hver gang, men du kan også bare skrive adressen i adressebaren (eller følge et link hen til siden) når du har startet applikationen med F5. mvh
du kan start med at sætte et breakpoint i den linie der kalder Util.GetLocalizedString..., og så kan du følge kaldet ved "step into" fra debugmenuen, eller ved at trykke på F11. mvh
For tager jeg en linkbutton og ligger den uden for datagrid så virker det fint med at hente en tekst igennem min function så det må jo have noget med datagrid at gøre ?
nu ved jeg ikke hvor meget du har lavet af det vi har skrevet om, så jeg har ikke rigtig noget at sige til det, men hvis du har et setup som det her : <asp:DataGrid id="DataGrid1" runat="server"> <Columns> <asp:TemplateColumn> <ItemTemplate> <asp:LinkButton ID="someLinkButton" Runat="server" Text='<%# GetText() %>'></asp:LinkButton> </ItemTemplate> </asp:TemplateColumn> </Columns> </asp:DataGrid>
og en metode der hedder GetText() ell. så skulle der ikke være nogle problemer... fik du checket hvad metoden returnerer ? - det kan jo være du bare får returneret en tom streng.
Jeg er ikke helt med på hvad du mener men min func ser således ud :
Public Shared Function GetLocalizedString(ByVal type As String) As String Dim ses As String = CType(HttpContext.Current.Session("setLanguage"), String)
If HttpContext.Current.Cache("LoginLanguage" + ses) Is Nothing Then Dim ds As DataSet = New DataSet ds.ReadXml(HttpContext.Current.Server.MapPath("/try2try/Xml/" & ses & ".xml"))
Dim depends As New _ System.Web.Caching.CacheDependency _ (HttpContext.Current.Server.MapPath("/try2try/Xml/" & ses & ".xml"))
HttpContext.Current.Cache.Insert("LoginLanguage" + ses, ds, depends) End If
Return CType(HttpContext.Current.Cache("LoginLanguage" + ses), DataSet).Tables(0).Rows(0)(type).ToString() End Function
Public Shared Function GetLocalizedString(ByVal type As String) As String Dim ses As String = CType(HttpContext.Current.Session("setLanguage"), String)
If HttpContext.Current.Cache("LoginLanguage" + ses) Is Nothing Then Dim ds As DataSet = New DataSet ds.ReadXml(HttpContext.Current.Server.MapPath("/try2try/Xml/" & ses & ".xml"))
Dim depends As New _ System.Web.Caching.CacheDependency _ (HttpContext.Current.Server.MapPath("/try2try/Xml/" & ses & ".xml"))
HttpContext.Current.Cache.Insert("LoginLanguage" + ses, ds, depends) End If
Return CType(HttpContext.Current.Cache("LoginLanguage" + ses), DataSet).Tables(0).Rows(0)(type).ToString() End Function 'sæt breakpoint her, og hold musen over funktionsnavnet når du stopper der - så viser den dig hvad den returnerer
Så viser den GetLocalizedString = "Index" og det skulle egentligt være "Vis Nyhed" udfra at valget på den side hvor jeg vil bruge functionen ! Hvad fortæller det mig ?
det fortæller dig at dit setup ikke fungerer som du forventer.... lige for at gøre det nemmere - så bryd den sidste linie i metode op : Return CType(HttpContext.Current.Cache("LoginLanguage" + ses), DataSet).Tables(0).Rows(0)(type).ToString()
til Dim s As String = CType(HttpContext.Current.Cache("LoginLanguage" + ses), DataSet).Tables(0).Rows(0)(type).ToString() return s
så kan du sætte breakpoint på return s og hver gang se hvad s indeholder når du breaker der.
nope... den fortæller dig at du ser nøjagtig det på skærmen som du skal se - nemlig ingenting :o) såh... din GetLocalizedString holder ikke helt vand. mvh
du sender en parameter med (type) og den er sikkert forkert... hvis det er en værdi du udleder fra noget der har med kontrollens id at gøre, skal du være opmærksom på, at frameworket piller ved dine id's således at det er garanteret at der ikke optræder to serverkontroller med samme id på en webform. men ... check parameteren (type) og se om der står noget der skulle returnerer dig noget fra xml-filen. mvh
ja jeg må lige rende det hele igennem for at se hvor det er det glipper. jeg vender lige tilbage til det med headertext når jeg har fået det andet løst :o)
mmm.... jeg plejer at bruge de indbyggede mekanismer, og jeg vil nok anbefale dig at gøre det samme.
hvis du sørger for at du kan se alle filer i din solution (der er en knap med et symbol øverst i din solution explorer, der ligner 3 forskelligt udseende filer, som du kan klikke på for at se dem). så får du krydser ud for dine aspx-filer, og du kan så folde ud og se at der ligger dels din code-behind fil, men også en fil der slutter på .resx.
den fil kan du åbne, og tilføje dine egne strenge i (du kan nøjes med at angive name og value), og dem kan du så hente fra din kode :
hvis din klasse hedde SomePage, og dit namespace hedder SomeNamespace - kan du oprette en resourcemanager der suger fra standard-ressourcefilen sådan her :
(forudsætter at har indsat en række i ressourcefilen med name=testtekst) ResourceManager rm = new ResourceManager("SomeNamespace.SomePage",Assembly.GetExecutingAssembly()); Response.Write(rm.GetString("testtekst"));
du kan også bare lave en enkelt fil for hele dit web - og suge i den.
hvis du vil understøtte flere sprog, opretter du bare filer hvor country-code indgår i navnet, og skriver de tekster der skal vises på de nye sprog i dem. fallback for du foræret.
hvis du får returneret nothing fra funktionen er det self. også det du får vist. men hvad sender du med som parameteren type i de situationer hvor det virker, og hvad sender du med når det er en kontrol i griddet der kalder metoden ? - det er jo tydeligvis ikke det samme, når metoden returnerer noget forskelligt. mvh
du skriver det i data... men følg det link jeg gav og studér det lidt nærmere inden du kaster dig ud i det. (navngivningen er næsten rigtig... din culture-code skal stå lige før .resx). mvh
1) LinkButton i datagrid - someLinkButton.Text = GetLocalizedString("newslistone") - viser "newslistone" som type
2) Linkbutton uden for datagrid - LinkButton1.Text = GetLocalizedString("newslistone") - viser "newslistone" som type
Når jeg holder musen over GetLocalizedString ved debug viser de begge 2 = nothing men køre jeg siden viser den fint tekst LinkButton1 som er "Vis Nyhed", men når jeg køre med someLinkButton som ogsp burde vise "Vis Nyhed" så kommer den med denne fejl :
Exception Details: System.NullReferenceException: Object reference not set to an instance of an object
Og jeg holder altid kontrollens id adskilt fra (type) i min xml fil så det skulle heller ikke være der det misser.
Og det hele er en kopi af det du har lavet længere oppe så det eneste jeg har på min side er et datagrid med en linkbutton i samt en linkbutton uden for datagrid, bare for at det ikke skule skabe andre problemer.
hvis du arbejder med en LinkButton i et datagrid - skal du sørge for, at du f.eks. i forbindelse med databinding trækker din tekstværdi fra en metode som vist her :
og du kan lave en GetText-metode der kalder din ulitity-klasse : Public Shared Function GetText(ByVal type As String) As String return Util.GetLocalizedString(type) End Function
en deklaration i toppen for en kontrol i en liste kan du ikke rigtig bruge til så meget .... hvis der er 100 rækker i listen, skulle du jo så have 100 forekomster - sådan fungerer det ikke. såh... din null-exception har at gøre med at den kontrol du arbejder med i koden ikke er initialiseret - og derfor er null.
forskellen er, at frameworket ikke automatisk initialiserer din LinkButton hvis det er en tilfældig linkbutton i en liste.
hvis du bare har haft en dekleration : Dim lbtn As LinkButton
giver det ikke rigtig nogle muligheder for frameworket for at vide hvilken en af de måske flere hundrede linkbuttons der er i en liste lbtn skulle initialiseres til ?
hvor har du skrevet koden ? (for god ro og ordens skyld - så prøv at par forskellige kolonner.... bare så det ikke er fordi din kolonne har visible=false eller et eller andet andet). metoden er gangbar nok (hvis eller dit datagrid hedder DataGrid1). mvh
ah... så du sidder og flytte rundt på koden når du prøver det ene og det andet din bandit ;o) den fra 23:39:30 holder jo ikke en bønne, hvis det ikke er samme eksekvering...
første spørgsmål : se 19/05-2005 23:04:31 andet spørgsmål : du kan godt lave mere med property builderen... du kan bare oprette en almindelig bound-column først, og så bagefter konvertere den til en templatecolumn (det er en mulighed der er i det vindue, hvor du opretter din kolonner). du kan også højreklikke på griddet, og trykke på edit template, hvorefter du kan vælge hvilken en du vil editere... så kan du trække alt det ind du vil fra toolboxen. mvh
hvis du sætter en knap ind - kan du bare angive hvilken metode du vil have kaldt når der klikkes på den : <asp:Button id="someButton" runat="server" OnClick="someButton_Click"></asp:Button>
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.