Avatar billede websam Nybegynder
19. maj 2005 - 15:39 Der 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 ?

/Websam
Avatar billede snepnet Nybegynder
19. maj 2005 - 17:04 #1
hej websam :o)

du har lidt forskellige muligheder...

en linkbutton :

<ItemTemplate>
    <asp:LinkButton runat="server" Text='<%# GetText("TXT_EDIT") %>' CommandName="Edit" id="lbtnEdit"></asp:LinkButton>
</ItemTemplate>

i din tekstproperty angiver du så et databindingsudtryk, og laver en metode til at returnere teksten :

protected string GetText(string textIdentification)
{
  switch(textIdentification)
  {
    case "TXT_EDIT" : return "Blah";
    default : return String.Empty;
  }
}

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).

så ender du med noget i denne stil istedet :

protected string GetText(string controlId)
{
  someResourceManager.GetString(controlId);
}

du skal ikke stå for meget andet selv i den forbindelse, end at sætte din aktuell UiCulture :

System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("da-DK");

hvis du kigger lidt i docs under localization, ligger der masser af guldkorn, og du kan bare spørge her hvis der er noget til det.

håber det var lidt at løbe videre på.

mvh
Avatar billede websam Nybegynder
19. maj 2005 - 17:26 #2
Det var en helt masse på en gang :o)

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 :

protected string GetText(string textIdentification)
{
  switch(textIdentification)
  {
    case "TXT_EDIT" : return "Blah";
    default : return String.Empty;
  }
}

må jo alt andet lige være den jeg allerede har fået lavet, så jeg prøver lige at rode med det i codebehind og vender tilbage :o)

/Websam
Avatar billede snepnet Nybegynder
19. maj 2005 - 17:32 #3
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
Avatar billede websam Nybegynder
19. maj 2005 - 17:41 #4
Det er der for det er ikke en enkeltstående linkbutton der er tale om det er en linkbutton inde i et datagrid og når jeg tager din :

<ItemTemplate>
    <asp:LinkButton runat="server" Text='<%# GetText("TXT_EDIT") %>' CommandName="Edit" id="lbtnEdit"></asp:LinkButton>
</ItemTemplate>

Så vil den jo klart ikke acceptere det inden for et datagrid. Så for at specificere det helt ud så er det følgende linier fra et datagrid :

<asp:BoundColumn DataField="thedate" HeaderText="Dato"></asp:BoundColumn>

Her er det "HeaderText" jeg vil have variabel


<asp:HyperLinkColumn Text="Vis" DataNavigateUrlField="NewsId" DataNavigateUrlFormatString="?m=newslistone&id={0}"></asp:HyperLinkColumn>

Her er det "Text" jeg vil have variabel


Det er nok mig der ikke forklare det godt nok :o)

/Websam
Avatar billede snepnet Nybegynder
19. maj 2005 - 17:56 #5
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.

mvh
Avatar billede websam Nybegynder
19. maj 2005 - 18:00 #6
Er du venlig at prøve at sende mig den kode du anvender til et datagrid ?
Avatar billede websam Nybegynder
19. maj 2005 - 18:03 #7
og nej Text='<%# GetText("TXT_EDIT") %>' er ikke fint gangbar den kommer med fejl når jeg forsøger mig med det :o(
Avatar billede snepnet Nybegynder
19. maj 2005 - 18:06 #8
hvilken fejl ?
og jeps - jeg laver et grid og poster det om lidt.
mvh
Avatar billede websam Nybegynder
19. maj 2005 - 18:12 #9
Hvis jeg f.eks laver følgende :

<asp:BoundColumn DataField="thedate" HeaderText='<%# util.getlocalizedstring("newsdate")%>'></asp:BoundColumn>

Så får jeg denne fejl :

Compiler Error Message: BC30676: 'DataBinding' is not an event of 'System.Web.UI.WebControls.BoundColumn'

Og på et HyperLinkColumn :

<asp:HyperLinkColumn Text='<%# util.getlocalizedstring("newsshow")%>' DataNavigateUrlField="NewsId" DataNavigateUrlFormatString="?m=newslistone&id={0}"></asp:HyperLinkColumn>

Får jeg denne fejl :

Compiler Error Message: BC30676: 'DataBinding' is not an event of 'System.Web.UI.WebControls.HyperLinkColumn'

/websam
Avatar billede snepnet Nybegynder
19. maj 2005 - 18:15 #10
<asp:DataGrid id="DataGrid1" runat="server">
<Columns>
    <asp:BoundColumn DataField="FldString" HeaderText="YuHah"></asp:BoundColumn>
    <asp:TemplateColumn>
        <ItemTemplate>
            <asp:LinkButton ID="someLinkButton" Runat="server" Text='<%# GetText() %>'></asp:LinkButton>
        </ItemTemplate>
    </asp:TemplateColumn>
</Columns>
</asp:DataGrid>

og koden :
protected System.Web.UI.WebControls.DataGrid DataGrid1;

private void Page_Load(object sender, System.EventArgs e)
{
    // Put user code to initialize the page here
    if(!IsPostBack)
    {
        BindGrid();
    }
}

private void BindGrid()
{   
    DataSet ds = new ExpDataAccess().GetSampleData(50);
    this.DataGrid1.DataSource = ds;
    this.DataGrid1.DataBind();               
}

public string GetText()
{
    return "tekst";
}
Avatar billede snepnet Nybegynder
19. maj 2005 - 18:24 #11
arh ... du har fuldstændig ret - headerkolonnen databindes ikke, og det samme med en hyperlinkkolonne - sorry sorry sorry :o(

hvis du skal gøre det med en HyperLinkColumn skal du bruge DataTextField for den tekst der vises, og DataNavigateUrlField for det link der vises.

jeg er meget ked af at jeg var lidt for hurtig der .... jeg er nok ved at blive gammel.

mvh
Avatar billede snepnet Nybegynder
19. maj 2005 - 18:30 #12
(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
Avatar billede snepnet Nybegynder
19. maj 2005 - 18:34 #13
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
Avatar billede websam Nybegynder
19. maj 2005 - 18:45 #14
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")
       
        DataGrid1.DataSource = objDataSet
        DataGrid1.DataBind()

        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 :

YuHah  NewsId Headline TheDate
1 lalala  1 Teste nyhed 12-12-2004 13:03:43
2 lalala  2 Nyhed Nummer 2 25-04-2004 13:03:42
3 lalala  3 tester 18-05-2005 21:10:00
4 lalala  4 Asp.Net applicationer 18-05-2005 23:33:14
5 lalala  5 test 18-05-2005 23:36:10
6 lalala  6 Nyheder virker 19-05-2005 09:54:38
7 lalala  7 Tester Igen 19-05-2005 14:40:30

hvor den kun skulle vise de første 2 rækker :

YuHah 
1 lalala 
2 lalala 
3 lalala 
4 lalala 
5 lalala 
6 lalala 
7 lalala

så er der lidt at snakke om :o)

/Websam
Avatar billede snepnet Nybegynder
19. maj 2005 - 18:56 #15
hej igen :o)

du sætter ikke din linkbutton ind :

Dim someLinkButton As LinkButton = New LinkButton
someLinkButton.Text = Util.GetLocalizedString("newslistone")

den havner ingen steder ... det er derfor du ikke kan se teksten.

mht. til det med at du se for mange kolonner, så er det nok fordi du ikke har sat AutoGenerateColumns til false på dit grid :

<asp:datagrid id="DataGrid1" runat="server" AutoGenerateColumns="False">

mvh
Avatar billede snepnet Nybegynder
19. maj 2005 - 19:01 #16
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.

var det uklart ?

mvh
Avatar billede websam Nybegynder
19. maj 2005 - 19:11 #17
Ja det undrede mig også at den ikke havde lavet det selv, men jeg tilføjede det manuelt og lavede så denne :

someLinkButton.Text = Util.GetLocalizedString("newslistone")

Men nu kommer den med denne fejl :

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Skal denne someLinkButton.Text = Util.GetLocalizedString("newslistone") ligge i pageload eller ?

/Websam
Avatar billede snepnet Nybegynder
19. maj 2005 - 19:16 #18
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.

mvh
Avatar billede websam Nybegynder
19. maj 2005 - 19:25 #19
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 ?

/Websam
Avatar billede snepnet Nybegynder
19. maj 2005 - 19:29 #20
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
Avatar billede websam Nybegynder
19. maj 2005 - 19:35 #21
Ja ja så virker det men det er jo ikke i min default fil jeg har det liggende det er i en fil liggende i en mappe hvordan virker det ?

/Websam
Avatar billede snepnet Nybegynder
19. maj 2005 - 19:37 #22
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
Avatar billede websam Nybegynder
19. maj 2005 - 19:39 #23
ja det fandt jeg ud af men jeg kan ikke lige se hvor jeg ser fejlen henne ?
Avatar billede snepnet Nybegynder
19. maj 2005 - 19:42 #24
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
Avatar billede websam Nybegynder
19. maj 2005 - 19:47 #25
ja så hopper den ind i min function som virker alle andre steder bare ikke i et datagrid så det bliver jeg ikke meget klogere af :o)

/Websam
Avatar billede snepnet Nybegynder
19. maj 2005 - 19:51 #26
jamen hvad returnerer den derindefra ?
Avatar billede websam Nybegynder
19. maj 2005 - 19:51 #27
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 ?

/Websam
Avatar billede snepnet Nybegynder
19. maj 2005 - 19:56 #28
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.

mvh
Avatar billede websam Nybegynder
19. maj 2005 - 19:57 #29
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
Avatar billede websam Nybegynder
19. maj 2005 - 19:59 #30
Jeg har lavet din opsætning og den virker fint lige bortset fra at datagrid viser mere end det skal :

YuHah  NewsId Headline TheDate
1 lalala  1 Teste nyhed 12-12-2004 13:03:43
2 lalala  2 Nyhed Nummer 2 25-04-2004 13:03:42
3 lalala  3 tester 18-05-2005 21:10:00
4 lalala  4 Asp.Net applicationer 18-05-2005 23:33:14
5 lalala  5 test 18-05-2005 23:36:10
6 lalala  6 Nyheder virker 19-05-2005 09:54:38
7 lalala  7 Tester Igen 19-05-2005 14:40:30

hvor den kun skulle vise de første 2 rækker :

YuHah 
1 lalala 
2 lalala 
3 lalala 
4 lalala 
5 lalala 
6 lalala 
7 lalala
Avatar billede snepnet Nybegynder
19. maj 2005 - 20:01 #31
har du læst det jeg skrev om AutoGenerateColumns ?
det var her : 19/05-2005 18:56:32
Avatar billede snepnet Nybegynder
19. maj 2005 - 20:04 #32
og

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
Avatar billede websam Nybegynder
19. maj 2005 - 20:21 #33
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 ?

/Websam
Avatar billede snepnet Nybegynder
19. maj 2005 - 20:25 #34
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.

fik du fikset det med AutoGenerateColumns ?

mvh
Avatar billede websam Nybegynder
19. maj 2005 - 20:41 #35
AutoGenerateColumns har jeg sat ind den havde jeg overset og nu viser den GetLocalizedString = Nothing og det er jo ikke godt :o)

/Websam
Avatar billede snepnet Nybegynder
19. maj 2005 - 20:43 #36
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
Avatar billede websam Nybegynder
19. maj 2005 - 20:59 #37
men hvor går det så galt henne når det virker alle andre steder men ikke i forbindelse med et datagrid ?
Avatar billede snepnet Nybegynder
19. maj 2005 - 21:04 #38
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
Avatar billede websam Nybegynder
19. maj 2005 - 21:24 #39
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)

Men ser selve min function ellers godt nok ud ?
Avatar billede websam Nybegynder
19. maj 2005 - 21:33 #40
Og er du sikker på at GetLocalizedString = Nothing har noget på sig for det virker alle andre steder men bare ikke i forbindelse med et datagrid ?

/Websam
Avatar billede snepnet Nybegynder
19. maj 2005 - 21:51 #41
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.

du kan tage et kig her :
http://samples.gotdotnet.com/quickstart/aspplus/

mvh
Avatar billede snepnet Nybegynder
19. maj 2005 - 21:52 #42
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
Avatar billede websam Nybegynder
19. maj 2005 - 22:07 #43
Ok for det første skal jeg skrive det i data eller resheader ?

Skal jeg så hvis jeg vil have mere end til et sprog lave f.eks en-us.aspx.resx eller forstod jeg det rigtigt ?

/Websam
Avatar billede snepnet Nybegynder
19. maj 2005 - 22:10 #44
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
Avatar billede websam Nybegynder
19. maj 2005 - 22:17 #45
Er det dette afsnit du henviser til "Working with Resource Files" ?

19/05-2005 21:52:38 og til svar på denne så tog jeg en jeg viste der virkede da jeg ville teste det inde i et datagrid og der virker det bare ikke :o(

/Websam
Avatar billede snepnet Nybegynder
19. maj 2005 - 22:25 #46
Der er flere link derude omkring localization, så det var egentlig mere genrelt jeg mente det - men klart - det med ressourcefilerne er relevant.

men ... vil du ikke nok være rar at checke hvad du propper ind i metoden GetLocalizedString

// du smider en variabel med
Public Shared Function GetLocalizedString(ByVal type As String) As String

// der bruges til at slå op i en ressource
Return CType(HttpContext.Current.Cache("LoginLanguage" + ses), DataSet).Tables(0).Rows(0)(type).ToString()

1) når din linkbutton er uden for griddet virker et
- og hvad indeholder variablen type så i det tilfælde ?

2) når din linkbutton er i griddet virkder det ikke
- og hvad indeholder variablen type så ?

kig så også igen på det jeg skrev her :
19/05-2005 21:04:33

mvh
Avatar billede websam Nybegynder
19. maj 2005 - 22:39 #47
Det skal du da få her, jeg laver følgende test :

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

Så jeg fatter hat af hvorfor det ikke virker !?!

/Websam
Avatar billede websam Nybegynder
19. maj 2005 - 22:46 #48
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.

/Websam
Avatar billede snepnet Nybegynder
19. maj 2005 - 22:51 #49
vi er et stykke tilbage i historien så :o)

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 :

<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>

den kalder så GetText() - uden parameter, så hvis du skal have en parameter med må du angive den :

<asp:LinkButton ID="someLinkButton" Runat="server" Text='<%# GetText("newslistone") %>'></asp:LinkButton>

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.

mvh
Avatar billede websam Nybegynder
19. maj 2005 - 22:57 #50
ja og det virker som det skal men hvad f...... er forskellen :o)

/Websam
Avatar billede websam Nybegynder
19. maj 2005 - 23:02 #51
så mangler jeg bare at få det på plads med headertext i et BoundColumn og har jeg fanget det korekt hvis det skal være sådan her :

someGrid.Columns(0).HeaderText = GetText("newslistone") ?

/Websam
Avatar billede snepnet Nybegynder
19. maj 2005 - 23:04 #52
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 ?

mvh
Avatar billede snepnet Nybegynder
19. maj 2005 - 23:05 #53
jeps - someGrid.Columns(0).HeaderText = GetText("newslistone") vil sætte headerteksten i den første kolonne.
mvh
Avatar billede websam Nybegynder
19. maj 2005 - 23:08 #54
DataGrid1.Columns(0).HeaderText = GetText("newslistone") giver bare intet resultat den kommer ud blank men uden nogen fejl !?!

/Websam
Avatar billede snepnet Nybegynder
19. maj 2005 - 23:19 #55
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
Avatar billede websam Nybegynder
19. maj 2005 - 23:25 #56
koden er skrevet i page_load i codbehind og den eneste kolonne jeg har er id og den er ikke sat til visible=false :o)

/Websam
Avatar billede snepnet Nybegynder
19. maj 2005 - 23:27 #57
prøv lige at sæt den til en konstant, og check at den farve du uskriver med ikke er baggrundsfarven ;o)
Avatar billede websam Nybegynder
19. maj 2005 - 23:29 #58
har jeg lige testet og så skrives det med sort på hvid :o)
Avatar billede snepnet Nybegynder
19. maj 2005 - 23:31 #59
så er det din GetText("newlistone") der ikke returnerer noget.
Avatar billede websam Nybegynder
19. maj 2005 - 23:33 #60
nej nu stopper du :o) det er den samme som vi lige har brugt på linkbutton så der er sq noget at vise *GGGG*

/websam
Avatar billede snepnet Nybegynder
19. maj 2005 - 23:38 #61
:oD
Avatar billede snepnet Nybegynder
19. maj 2005 - 23:39 #62
hvis

DataGrid1.Columns(0).HeaderText = "hej"
udskriver noget, og
DataGrid1.Columns(0).HeaderText = GetText("newslistone")
ikke udskriver noget

er det fordi du ikke får noget tilbage fra GetText - hvorfor du ikke får noget tilbage ved jeg ikke, men du sidder jo lige klar ved debuggeren ;o)
Avatar billede websam Nybegynder
19. maj 2005 - 23:41 #63
så fandt jeg vist fejlen det ser ud til at virke hvis koden står før databind() i pageload :o))
Avatar billede snepnet Nybegynder
19. maj 2005 - 23:44 #64
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...
Avatar billede websam Nybegynder
19. maj 2005 - 23:51 #65
jo det gør for de stod det samme sted :o) på det tidspunkt nemmelig under databind()

En sidste ting inden lukketid. Hvordan kan det være at vs ikke selv smidder :

Protected WithEvents btn_newsedit As System.Web.UI.WebControls.LinkButton

ind i codebehind når jeg tilføjer :

<asp:TemplateColumn>
    <ItemTemplate>
        <asp:LinkButton ID="btn_newsedit" Runat="server" Text='<%# GetText("newsedit") %>'>
        </asp:LinkButton>
    </ItemTemplate>
</asp:TemplateColumn>

og udfra property builderen kan jeg ikke lave andet end :

<asp:TemplateColumn>
</asp:TemplateColumn>

Sidder jeg og sover et sted ?
Avatar billede snepnet Nybegynder
19. maj 2005 - 23:58 #66
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
Avatar billede websam Nybegynder
20. maj 2005 - 00:01 #67
ok takker smid et svar og mange tak for hjælpen :o)
Avatar billede snepnet Nybegynder
20. maj 2005 - 00:02 #68
u r welcome :o)
mvh
Avatar billede websam Nybegynder
20. maj 2005 - 00:24 #69
ups allmost done hvordan får jeg handling på mine buttons i datagrid ?
Avatar billede snepnet Nybegynder
20. maj 2005 - 00:33 #70
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>

og handleren :
private void someButton_Click(object sender, EventArgs e)
{
}

men du kan også hooke op på griddets standard-kommandoer, hvis du har tilføjet standardknapper (edit, update, delete og select).

eller har du en ItemCommand der fyres hvis du bare har sat noget ind i griddet der fyrer events.
mvh
Avatar billede websam Nybegynder
20. maj 2005 - 19:50 #71
kun hvis du har ? men hvordan for jeg f.eks id'et fra den enkelte record ud i min :

private void someButton_Click(object sender, EventArgs e)
{
}

/Websam
Avatar billede websam Nybegynder
20. maj 2005 - 20:23 #72
Never mind har fundet ud af det :o)
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