Avatar billede TV47 Seniormester
24. maj 2021 - 00:35 Der er 20 kommentarer og
2 løsninger

Templatefield, når et felt styrer værdi i et andet felt

Hej.

Jeg har lavet et standard insert, update og delete med templatefields.

Jeg har brug for, at når jeg ændrer værdien i et felt, så styrer det værdien i et andet felt. Altså f.eks. hvis jeg ændrer i feltet stk eller pris, så skal værdien i beløb (stk. * pris) ændres automatisk på basis af kodning.


Er det muligt at gøre?
Avatar billede arne_v Ekspert
24. maj 2021 - 02:21 #1
Er der ikke en on update / on change event hvor du kan putte opdatering ind?
Avatar billede TV47 Seniormester
24. maj 2021 - 09:41 #2
Starten af min kode ser sådan her ud.
Derefter kommer der noget SQL som skriver i databasen.
Har prøvet at skrive det med FileName, men det kompilerer ikke.
Hvordan skal det formentlig stå?

string filePath = @"C:\Users\Admin\Desktop\Bank.csv";
            StreamReader reader;
           
            using (SqlConnection sqlCon = new SqlConnection(connectionString))
            {
                sqlCon.Open();

                if (File.Exists(filePath))
                {
               
                    reader = new StreamReader(File.OpenRead(filePath));
               
                    List<string> listA = new List<string>();
                    List<string> listB = new List<string>();
                    List<string> listC = new List<string>();
               
                    while (!reader.EndOfStream)
                    {
                        var line = reader.ReadLine();
                        var values = line.Split(';');

                        listA.Add(values[0]);
                        listB.Add(values[1]);
                        listC.Add(values[2]);
                    }
Avatar billede TV47 Seniormester
24. maj 2021 - 09:43 #3
Nej glem den sidste, var en fejl der ikke skulle ind her.
Kan man slette sådan noget?

Arne, nej kan ikke se de events.
Hvordan får man dem frem?
Avatar billede arne_v Ekspert
24. maj 2021 - 15:51 #4
Nu fortæller du ikke hvilken type felt det er.

Men en ASP.NET web forms System.Web.UI.WebControls.TextBox har en TextChanged event.

Hvis du bruger et mere client side centric approach, så har input type=text en oninput event hvor du kan køre nogte client side JavaScript.
Avatar billede TV47 Seniormester
25. maj 2021 - 09:43 #5
Felttypen er en DropDownList.... både feltet som skal styres og feltet som skal styre.

Se også denne kode:
<asp:Templatefield HeaderText="Konto" ControlStyle-Width="100" >
                    <ItemTemplate>
                        <asp:Label ID="txtKontoLabel" Text='<%# Eval("Konto") %>' runat="server"/>                   
                    </ItemTemplate>                   
                    <EditItemTemplate>
                        <asp:DropDownList ID="txtKonto" runat="server" />                           
                    </EditItemTemplate>
                    <FooterTemplate>
                        <asp:DropDownList ID="txtKontoFooter" ControlStyle-Width="100" runat="server"/>                   
                    </FooterTemplate>                     
            </asp:Templatefield>
            <asp:Templatefield HeaderText="Momskode" ControlStyle-Width="100">
                    <ItemTemplate>
                        <asp:Label ID="txtMomskodeLabel" Text= '<%# Eval("Momskode") %>' runat="server" />
                    </ItemTemplate>
                    <EditItemTemplate>
                        <asp:DropDownList ID= "txtMomskode" runat="server" />
                    </EditItemTemplate>
                    <FooterTemplate>
                        <asp:DropDownList ID= "txtMomskodeFooter" ControlStyle-Width="100" runat="server" />
                    </FooterTemplate>
            </asp:Templatefield>
Avatar billede arne_v Ekspert
25. maj 2021 - 14:10 #6
DropDownList har en OnSelectedIndexChange.

og den vises faktisk i eksemplet i dokumentationen:

https://docs.microsoft.com/en-us/dotnet/api/system.web.ui.webcontrols.dropdownlist?view=netframework-4.8''

dog uden brug af template.
Avatar billede TV47 Seniormester
25. maj 2021 - 14:41 #7
Jeg har nu indføjet følgende i asp:
<asp:DropDownList ID= "txtMomskodeFooter" AutoPostBack="True" OnSelectedIndexChanged="Selection_Change" ControlStyle-Width="100" runat="server" />

Desuden følgende void:
void Selection_Change(Object sender, EventArgs e)
        {

            Response.Write("Test");
                //Calendar1.DayStyle.BackColor =
                //System.Drawing.Color.FromName(ColorList.SelectedItem.Value);

        }

Jeg får så desværre følgende runtimefejl, som jeg ikke forstår:

Beskrivelse: Der opstod en fejl under kompilering af en ressource, der er påkrævet ved behandling af denne anmodning. Læs følgende detaljer om fejlen, og foretag de nødvendige ændringer af kildekoden.

Fejlmeddelelse om kompileringsfunktion: CS1061: 'bruger_bogføring_aspx' does not contain a definition for 'Selection_Change' and no extension method 'Selection_Change' accepting a first argument of type 'bruger_bogføring_aspx' could be found (are you missing a using directive or an assembly reference?)
Avatar billede arne_v Ekspert
25. maj 2021 - 15:30 #8
Er metoden Selection_Change lagt ind i code behind?
Avatar billede TV47 Seniormester
25. maj 2021 - 15:48 #9
Hvis du mener at der skal være en void i C#, så se ovenfor.

Ellers ved jeg ikke hvad du mener med code behind?
Avatar billede TV47 Seniormester
25. maj 2021 - 15:57 #10
Shit... foran ordet void havde jeg glemt protected.
Så tror pokkers at man får mærkelige fejl.
Nå jeg fortsætter og ser om noget virker.
Avatar billede TV47 Seniormester
25. maj 2021 - 16:35 #11
Sådan, nu er der noget som virker.

Jeg har styr på indexchange og får den værdi der er valgt i konto kolonnen og kan også slå op i SQL og finde en anden værdi som hænger sammen med det opslag jeg har lavet i konto.

Det der nu er tilbage er at få værdien fra SQL indsat i en andet templatefield.
Nærmere betegnet er det feltet kaldet momskode, jf. ovenfor.
Desuden kan det nævnes at det er i footeren.

Hvad skal ændres får at det virker?
Kan det skrives i C# eller er det i ASP koden ovenfor?
Avatar billede arne_v Ekspert
25. maj 2021 - 16:38 #12
Ah. Ja - protected er nok vigtig.

Hvis jeg husker rigtig så arver den klasse som genereres fra .aspx filen fra code behind klassen.
Avatar billede arne_v Ekspert
25. maj 2021 - 16:45 #13
Med hensyn til opdatering, så vil jeg tro at det skal lave som:
- on change event på felt 1 opdaterer variabel X
- felt 2 henter værdi fra variabel X

Med en triparound til server så bør det virke.
Avatar billede arne_v Ekspert
25. maj 2021 - 16:50 #14
Og hvis jeg er lidt upræcis så kan det skyldes at jeg ikke har brugt ASP.NET web forms i ca. 10 år.

:-)
Avatar billede TV47 Seniormester
25. maj 2021 - 16:53 #15
Det er præcis det jeg allerede gør, altså on change opdateres variabel X.
Jeg mangler hvordan jeg får felt to til at henven værdi fra X.
Jeg har på fornemmelsen det er en asp ting....

Se asp footer på felt 2 (momskode) ovenfor... hvad skal ændres?
Avatar billede arne_v Ekspert
25. maj 2021 - 17:12 #16
<FooterTemplate>
                        <asp:DropDownList ID= "txtMomskodeFooter" ControlStyle-Width="100" runat="server" />
                    </FooterTemplate>

?

Der må du kunne lave en:

txtMomskodeFooter.SelectedIndex = ettal;
Avatar billede TV47 Seniormester
25. maj 2021 - 17:45 #17
Altså i ASP eller i C#?
Avatar billede arne_v Ekspert
25. maj 2021 - 18:30 #18
I C# koden som køres i Selection_Change.
Avatar billede TV47 Seniormester
25. maj 2021 - 18:53 #19
txtMomskodeFooter er ikke noget kode der kompilerer i min editor?
Avatar billede TV47 Seniormester
26. maj 2021 - 14:48 #20
Hmm, den kan jeg ikke greje... har prøvet alt muligt.

Hvordan får jeg givet nedenstående den værdi jeg har i en string variabel?

<FooterTemplate>
                        <asp:DropDownList ID= "txtMomskodeFooter" ControlStyle-Width="100" runat="server" />
                    </FooterTemplate>
Avatar billede arne_v Ekspert
26. maj 2021 - 15:38 #21
Lidt googling antyder at man skal bruge:

dincontainer.FooterRow.FindControl("txtMomskodeFooter").SelectedIndex = ettal;

Det jeg googlede var:

https://www.aspsnippets.com/Articles/Find-and-Access-Controls-in-GridView-FooterTemplate-Footer-Row-in-ASPNet.aspx
Avatar billede TV47 Seniormester
26. maj 2021 - 16:10 #22
Jeg skylder vist lige..... sådan ser det ud, når det virker:

SqlCon.Open();
                string sqlquery10 = "SELECT Code FROM Momskoder";
                SqlCommand sqlcomm10 = new SqlCommand(sqlquery10, SqlCon);
                SqlDataAdapter sda10 = new SqlDataAdapter(sqlcomm10);
                DataTable dt10 = new DataTable();
                sda10.Fill(dt10);
                SqlCon.Close();

                DropDownList dropdown10 = GridView1.FooterRow.FindControl("txtMomskodeFooter") as DropDownList;
                //var dropdown10 = (DropDownList)e.Row.FindControl("txtMomsKodeFooter");
                dropdown10.DataSource = dt10;
                dropdown10.DataTextField = "Code";
                dropdown10.DataValueField = "Code";
                dropdown10.DataBind();
                dropdown10.Items.Insert(0, new ListItem("Vælg Momskode", ""));
                dropdown10.SelectedValue = Momskode;
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

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