Avatar billede beef12 Nybegynder
05. august 2006 - 17:12 Der er 18 kommentarer og
1 løsning

Generere TextBox

Er der nogen der har en god ide til hvordan jeg kan løse følgende problemstilling.

Jeg vil gerne, i min form, generere ekstra textbox's når brugeren klikker på et link. Her er et simpelt eksempel:

<form>
<input type="text" name="box1" /> <br />
<a>tilføj ny textbox</a>
</form>

Når brugeren klikker på linket bliver han/hun præsenteret for følgende form:

<form>
<input type="text" name="box1" /> <br />
<input type="text" name="box2" /> <br />
<a>tilføj ny textbox</a>
</form>

Hvorefter brugeren kan klikke på linket igen eller blot submitte formen.
Det naturligvis vigtigt at jeg også får de foreløbige indtastede værdier med, når der genereres en ny textbox.

Anyone?
Avatar billede neoman Novice
05. august 2006 - 17:28 #1
Du kunne følge samme fremgangsmåde som i : http://www.eksperten.dk/spm/713854
Avatar billede beef12 Nybegynder
05. august 2006 - 17:32 #2
Jeg koder desværre i C# og jeg er virkelig en spade til VB.
Jeg skal nok prøve mig frem. Men hvis du gider må du meget gerne oversætte de centrale dele til C# (hvis du altså kan).

Takker.
Avatar billede neoman Novice
05. august 2006 - 17:45 #3
Det centrale dér er håndteringen af HandlingsTextBox ..  du skal have en panel hvortil du så dynamisk tilføjer textboxen i en eventhandler for din klik-knap, samt huske selv at holde styr på hvor mange textboxe du har (hvilket han gemmer i viewstate), fordi du skal re-generere dem for hver postback.

Jeg gætter på det vil tage dig kortere tid at gennemskue dette, end mig at klampe noget C#-halløj sammen, hehe. I øvrigt, ville undre mig meget hvis ikke snepnet ikke lige slår til om et øjeblik - og han har bare meget mere styr på C# end MOI :-)
Avatar billede beef12 Nybegynder
05. august 2006 - 18:56 #4
hehe. Ok.
Avatar billede snepnet Nybegynder
05. august 2006 - 21:04 #5
Avatar billede beef12 Nybegynder
06. august 2006 - 23:33 #6
Jeg prøvede det der denisbauer-link, men det gav nogle problemer og løsningen virkede lidt kompleks ift. at det er relativt simpel opgave.
Jeg fandt dog frem til følgende kodeeksempel (i C#) her: http://www.codeproject.com/aspnet/dynamiccontrols.asp

Men i har begge været meget hjælpsomme, så smid beege gerne et svar.
Avatar billede beef12 Nybegynder
06. august 2006 - 23:33 #7
beege = begge
Avatar billede beef12 Nybegynder
06. august 2006 - 23:45 #8
Men jeg kan måske på falderebet spørge om en sidste ting. Koden som jeg har fundet indsætter mine Controls på basis af positioner, hvor positionen bliver ganget ved hver iteration således at de ikke komme til at ligge oven i hinanden.
Min form derimod er opbygget som en tabel, så jeg vil gerne have at der tilføjes en ny tabel-row og indsætte mine Controls der. Koden jeg har fundet ser sådan ud (ved Btn_Click):

        private const int TOP = 96;
        private const int HEIGHT = 48;
        private const int BUTTON_LEFT = 48;
        private const int TEXTBOX_LEFT = 128;
        protected void Button1_Click(object sender, System.EventArgs e)
        {
            int lastControl = (int)this.Session["LastControl"];
            int count = lastControl/2 + 1;
            int top = TOP + HEIGHT*(count - 1);
            ControlInfo ci = PersistControl("Button" + count.ToString(),
                "Button", 
                top, BUTTON_LEFT,
                "Click");
            Button btn = (Button)CreateControl(ci);
            btn.Text = "Button " + count.ToString();               
            ci = PersistControl("TextBox" + count.ToString(),
                "TextBox", 
                top, TEXTBOX_LEFT,
                "TextChanged");
            CreateControl(ci);
            this.Session["LastControl"] = count*2;
        }
Avatar billede snepnet Nybegynder
07. august 2006 - 00:09 #9
Vil du positionere din kontroller inde i hver tabelcell - eller vil du bare have det i en tabel istedet?

Du kan få en tabelbaseret løsning her ... Bare som inspiration:

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class _724337 : System.Web.UI.Page
{
    protected int RowsCount
    {
        get
        {
            return ViewState["RowsCount"] != null ? (int)ViewState["RowsCount"] : 0;         
        }
        set
        {
            ViewState["RowsCount"] = value;
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        CreateRows();
    }

    protected void btnAddRow_Click(object sender, EventArgs e)
    {
        tblEntries.Rows.Add(CreateRow());
        RowsCount = tblEntries.Rows.Count - 1;
    }

    protected void CreateRows()
    {
        for (int i = 0; i < RowsCount; i++)
        {
            tblEntries.Rows.Add(CreateRow());
        }
    }

    protected TableRow CreateRow()
    {
        TableRow newRow = new TableRow();
        TableCell newCell = null;
        foreach (TableCell cell in tblEntries.Rows[0].Cells)
        {
            newCell = new TableCell();
            newCell.Controls.Add(new TextBox());
            newRow.Cells.Add(newCell);
        }
        return newRow;
    }
}

Med denne aspx-fil:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="724337.aspx.cs" Inherits="_724337" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
        <asp:Table ID="tblEntries" runat="server">
            <asp:TableRow runat="server" >
                <asp:TableCell runat="server">Header 1</asp:TableCell>
                <asp:TableCell runat="server">Header 2</asp:TableCell>
                <asp:TableCell runat="server">Header 3</asp:TableCell>
            </asp:TableRow>
        </asp:Table>
        <br />
        <asp:Button ID="btnAddRow" runat="server" OnClick="btnAddRow_Click" Text="Tilføj" />
    </form>
</body>
</html>

Mvh
Avatar billede beef12 Nybegynder
07. august 2006 - 19:07 #10
Damn snepnet - lækkert. Det var lige præcis det jeg søgte.
Smid et svar champ.
Avatar billede beef12 Nybegynder
07. august 2006 - 20:03 #11
Hvorfor kalder du egentlig CreateRows(); i PageLoad?
Avatar billede snepnet Nybegynder
07. august 2006 - 21:27 #12
Det er nødvendigt for at få genereret tabellen... Det skal gøres hver gang. Kontrollerne bliver ikke hængende.
Du kan med fordel fjerne det fra page_load, og gøre det sådan her istedet:

protected override void LoadViewState(object savedState)
{
    base.LoadViewState(savedState);
    CreateRows();
}

Mvh
Avatar billede snepnet Nybegynder
07. august 2006 - 21:27 #13
Og et svar :o)
Mvh
Avatar billede snepnet Nybegynder
07. august 2006 - 21:28 #14
Og jeg deler gerne med neoman.
Mvh
Avatar billede beef12 Nybegynder
07. august 2006 - 22:17 #15
snepnet > Ah ja, okay - nu er jeg med.

neoman > smider du lige et svar :-)
Avatar billede beef12 Nybegynder
08. august 2006 - 20:23 #16
Nå, han er nok taget på ferie :-)
Jeg lukker den bare.

Har du forøvrigt selv oplevet det problem at når du trykker på knappen og genererer textbox'ene at browser-vinduet hopper op til side-toppen? Det er rimelig træls, nu hvor jeg har textbox-genereringen til at foregå meget langt nede på min side.
Avatar billede snepnet Nybegynder
08. august 2006 - 23:58 #17
Du kan f.eks. i dit pagedirective angive
MaintainScrollPositionOnPostBack="true"
Det hjælper en hel del.
Mvh
Avatar billede beef12 Nybegynder
09. august 2006 - 07:46 #18
Tak - det virkede.
Avatar billede snepnet Nybegynder
09. august 2006 - 10:41 #19
Det var så lidt.
Mvh
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