Avatar billede testpilot_dk Nybegynder
10. december 2005 - 10:31 Der er 27 kommentarer og
1 løsning

Tabeller på Siden

Hej!

Jeg har lavet en side, hvor man har en tabel, denne tabel har x antal rækker!

Som start har den 5 rækker, så har jeg lavet en knap som skal tilføje en ekstra række til tabellen!

Det gør den også, men sletter samtidig de allerede eksisterende rækker, hvordan undgår jeg det.

Min kode er som følgende:

        protected System.Web.UI.WebControls.Button AddFields;
        protected System.Web.UI.WebControls.Button CreateDB;
        protected System.Web.UI.WebControls.TextBox TableName;
        protected System.Web.UI.WebControls.Table Table1;
        private System.Web.UI.WebControls.TableRow row;
        private System.Web.UI.WebControls.TableCell cell;

        private void Page_Load(object sender, System.EventArgs e)
        {
            if(!IsPostBack)
            {
                MakeStandardInput();
            }
        }

        private void MakeStandardInput()
        {
            MakeTopRowInTable();
            for(int i = 0; i < 5; i ++)
            {
                MakeRowInTable();
                counter ++;
            }
        }
       


        int counter = 0;

        private void MakeTopRowInTable()
        {
            row = new TableRow();
            cell = new TableCell();
            cell.Width = 50;
            cell.Text = "FeltNavn:";
            row.Cells.Add(cell);
            cell = new TableCell();
            cell.Width = 30;
            cell.Text = "Længde:";
            row.Cells.Add(cell);
            cell = new TableCell();
            cell.Width = 30;
            cell.Text = "Key:";
            row.Cells.Add(cell);
            this.Table1.Rows.Add(row);
        }

        private void MakeRowInTable()
        {
            row = new TableRow();

            cell = new TableCell();
            cell.Width = 50;
            System.Web.UI.WebControls.TextBox box = new TextBox();
            box.ID = "FieldName_" + counter.ToString();
            cell.Controls.Add(box);
            row.Cells.Add(cell);

            cell = new TableCell();
            cell.Width = 30;
            box = new TextBox();
            box.Width = 50;
            box.ID = "Length_" + counter.ToString();
            cell.Controls.Add(box);
            row.Cells.Add(cell);

            cell = new TableCell();
            cell.Width = 30;
            System.Web.UI.WebControls.CheckBox cBox = new CheckBox();
            cBox.ID = "PrimaryKey_" + counter.ToString();
            cell.Controls.Add(cBox);
            row.Cells.Add(cell);
           
            this.Table1.Rows.Add(row);
        }
        #region Web Form Designer generated code
        override protected void OnInit(EventArgs e)
        {
            //
            // CODEGEN: This call is required by the ASP.NET Web Form Designer.
            //
            InitializeComponent();
            base.OnInit(e);
        }
       
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {   
            this.AddFields.Click += new System.EventHandler(this.AddFields_Click);
            this.Load += new System.EventHandler(this.Page_Load);

        }
        #endregion

        private void AddFields_Click(object sender, System.EventArgs e)
        {
            MakeRowInTable();
        }
Avatar billede snepnet Nybegynder
10. december 2005 - 10:55 #1
du sætter kun de 5 rækker ind første gang brugeren ser siden (if(!IsPostBack)), så det er sådan set ikke fordi de bliver slettet... de bliver bare ikke sat ind.

nu ved jeg ikke hvor voldsomme datamængder du skal ende med at lægge i tabellen, men du må gemme det et eller andet sted (viewstate/session/appliation/... - og så bygge tabellen i forhold til det.

mvh
Avatar billede testpilot_dk Nybegynder
10. december 2005 - 11:00 #2
det er kun 10 - 15 felter, så det er ikke voldsomme mængder

hvordna skal jeg gemme det!

Jeg kan heller ikke få fat på mine ider igen

            string[] s_FieldArray = new string[counter];
            int[] s_LenghtArray = new int[counter];
            string[] s_PK = new string[counter];
            for(int i = 0; i < counter; i++)
            {
                System.Web.UI.WebControls.TextBox te = (TextBox)this.FindControl("FieldName_" + i.ToString());
                s_FieldArray[i] = te.Text;
                te = (TextBox)this.FindControl("Length_" + i.ToString());
                s_LenghtArray[i] = Convert.ToInt32(te.Text);
                System.Web.UI.WebControls.CheckBox bo = (CheckBox)this.FindControl("PrimaryKey_" + i.ToString());
                if(bo.Checked)
                    s_PK[i] = s_FieldArray[i];
                else
                    s_PK[i] = "";
            }

Jeg får null values tilbage
Avatar billede testpilot_dk Nybegynder
10. december 2005 - 11:08 #3
Jeg kan simpelthen ikke forstå hvorfor jeg ikke kan finde mine controls igen, er det fordi at jeg trykker på knappen eller er den noget andet
Avatar billede snepnet Nybegynder
10. december 2005 - 11:10 #4
hvornår eksekverer du den kode du sendte til mig nu?

jeg går ud fra at counter er en klassevariabel, men så vidt jeg kan se tæller du den kun op ved !IsPostBack.... så den vil være nul på alle andre request's end det første.

bruger du debuggeren?

mvh
Avatar billede testpilot_dk Nybegynder
10. december 2005 - 11:12 #5
hvis jeg kigger under this.controls

Så har jeg kun 3 controls, hvoraf den ene er html form!

Hvor lægger den mine ændre controls hen
Avatar billede testpilot_dk Nybegynder
10. december 2005 - 11:16 #6
jeps, counter er en variable!

Jeg bruger debuggeren!, har ændret sådan at min counter tælles op hver gang MakeRowInTable bliver kaldt!
Avatar billede snepnet Nybegynder
10. december 2005 - 11:16 #7
så vidt jeg kan se har angivet din tabel i aspx-filen, og det er til tabellen du tilføjer kontroller når du opretter nye rækker.

hvis du vil kigge din tabel igennem for rækker mv - skal du gøre noget i denne stil:

foreach(TableRow row in table1.Rows)
{
  // gør noget for hver række
  foreach(TableCell cell in row.Cells)
  {
    // gør noget for hver cell
  }
}

mvh
Avatar billede snepnet Nybegynder
10. december 2005 - 11:16 #8
værdien af counter bliver ikke gemt mellem hver request - med mindre du selv gør det.
mvh
Avatar billede testpilot_dk Nybegynder
10. december 2005 - 11:23 #9
ja okay, det må jeg jo så finde ud af!

Troede bare jeg kunne få fat i dem via dem øverste contorls
Avatar billede snepnet Nybegynder
10. december 2005 - 11:31 #10
du kan også gøre det med FindControl(...) men de kontroller du har trukket ind på siden får du også som variable på klassen - så dem kan du gå direkte på.

FindControl(...) kan du altid benytte, men så skal du kende kontrollens unikke id i den aktuelle kontekst.

arbejder du f.eks. med en repeater hvor du har en itemtemplate hvor du sætter sådan en her ind:

<asp:TextBox id="txtName" runat="server" ...

vil du kunne finde den med FindControl("txtName") på et repeateritem, selvom det resulterende id i html'en er præfixet med diverse andre navne.

hvis du vil bruge FindControl(...) for at finde samme tekstboks i et repeateritem - skal du kende det fulde id, der bliver genereret af frameworket.

mvh
Avatar billede testpilot_dk Nybegynder
10. december 2005 - 11:40 #11
Min kode ser sådan ud

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;


using Handler;
namespace Stamdatabase_Web
{
    /// <summary>
    /// Summary description for CreateTable.
    /// </summary>
    public class CreateTable : System.Web.UI.Page
    {
        protected System.Web.UI.WebControls.Button AddFields;
        protected System.Web.UI.WebControls.Button CreateDB;
        protected System.Web.UI.WebControls.TextBox TableName;
        protected System.Web.UI.WebControls.Table Table1;
        protected System.Web.UI.WebControls.CheckBox Versions;
        protected System.Web.UI.WebControls.DropDownList versions_id;
        protected System.Web.UI.WebControls.Label Label2;
        protected System.Web.UI.WebControls.Label Label1;

        private void Page_Load(object sender, System.EventArgs e)
        {
            if(!IsPostBack)
            {
                counter = 0;
                MakeStandardInput();
                FillListBox();
            }
        }

        public void FillListBox()
        {
            Handles.Instance().OpenConnection();
            IDataReader read = Handles.Instance().GetResult("SELECT * FROM SYSTEM_VERSION");
            if(read != null)   
            {
                while(read.Read())
                {
                    this.versions_id.Items.Add(read["VersionName"].ToString());
                }
            }
            Handles.Instance().CloseConnection();
        }

        private void MakeStandardInput()
        {
            MakeTopRowInTable();
            for(int i = 0; i < 5; i ++)
            {
                MakeRowInTable();
                counter ++;
            }
        }
       
        private static int counter = 0;

        private void MakeTopRowInTable()
        {
            System.Web.UI.WebControls.TableRow row;
            System.Web.UI.WebControls.TableCell cell;
            row = new TableRow();
            cell = new TableCell();
            cell.Width = 50;
            cell.Text = "FeltNavn:";
            row.Cells.Add(cell);
            cell = new TableCell();
            cell.Width = 30;
            cell.Text = "Længde:";
            row.Cells.Add(cell);
            cell = new TableCell();
            cell.Width = 30;
            cell.Text = "Key:";
            row.Cells.Add(cell);
            this.Table1.Rows.Add(row);
        }

        private void MakeRowInTable()
        {
            System.Web.UI.WebControls.TableRow row;
            System.Web.UI.WebControls.TableCell cell;
            row = new TableRow();

            cell = new TableCell();
            cell.Width = 50;
            System.Web.UI.WebControls.TextBox box = new System.Web.UI.WebControls.TextBox();
            box.ID = "FieldName_" + counter.ToString();
            cell.Controls.Add(box);
            row.Cells.Add(cell);

            cell = new TableCell();
            cell.Width = 30;
            box = new System.Web.UI.WebControls.TextBox();
            box.Width = 50;
            box.ID = "Length_" + counter.ToString();
            cell.Controls.Add(box);
            row.Cells.Add(cell);

            cell = new TableCell();
            cell.Width = 30;
            System.Web.UI.WebControls.CheckBox cBox = new System.Web.UI.WebControls.CheckBox();
            cBox.ID = "PrimaryKey_" + counter.ToString();
            cell.Controls.Add(cBox);
            row.Cells.Add(cell);
           
            this.Table1.Rows.Add(row);
            counter ++;
        }
        #region Web Form Designer generated code
        override protected void OnInit(EventArgs e)
        {
            //
            // CODEGEN: This call is required by the ASP.NET Web Form Designer.
            //
            InitializeComponent();
            base.OnInit(e);
        }
       
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {   
            this.AddFields.Click += new System.EventHandler(this.AddFields_Click);
            this.CreateDB.Click += new System.EventHandler(this.CreateDB_Click);
            this.Load += new System.EventHandler(this.Page_Load);

        }
        #endregion

        private void AddFields_Click(object sender, System.EventArgs e)
        {
            MakeRowInTable();
        }

        private void CreateDB_Click(object sender, System.EventArgs e)
        {
            string[] s_FieldArray = new string[counter];
            int[] s_LenghtArray = new int[counter];
            string[] s_PK = new string[counter];
            for(int i = 0; i < counter; i++)
            {
                System.Web.UI.WebControls.TextBox te = (TextBox)this.FindControl("FieldName_" + i.ToString());
                s_FieldArray[i] = te.Text;
                te = (TextBox)this.FindControl("Length_" + i.ToString());
                s_LenghtArray[i] = Convert.ToInt32(te.Text);
                System.Web.UI.WebControls.CheckBox bo = (CheckBox)this.FindControl("PrimaryKey_" + i.ToString());
                if(bo.Checked)
                    s_PK[i] = s_FieldArray[i];
                else
                    s_PK[i] = "";
            }

            Handles.Instance().CreateTables(TableName.Text, s_FieldArray, s_LenghtArray, s_PK);
            Server.Transfer("Success.aspx");
        }
    }
}
Avatar billede testpilot_dk Nybegynder
10. december 2005 - 11:40 #12
Jeg vil mene at jeg kender den korrekte ID, da jeg selv laver knappen og giver den et id, så tilføjer jeg den til min cell
Avatar billede testpilot_dk Nybegynder
10. december 2005 - 11:47 #13
Jeg har fundet mit problem, det er som du tidligere skrev, så skal jeg gemme min tabel eller noget i en session, hvordan gør jeg det!
Avatar billede testpilot_dk Nybegynder
10. december 2005 - 11:51 #14
Samt hvordan får jeg tabellen ud igen, så jeg kan arbejde videre på den
Avatar billede testpilot_dk Nybegynder
10. december 2005 - 13:36 #15
Hej Snepnet!

Send et svar!

Hvordan kan jeg styrer det med tabellen ind og ud af sessions ???
Avatar billede snepnet Nybegynder
10. december 2005 - 17:11 #16
jeg synes egentlig ikke du skal gemme din tabel i session - men det data du propper i den kunne være en god idé at lægge der.

har du f.eks. dine data i en DataTable - kan du jo :

DataTable dataTable = GetData(); // hvordan det nu foregår
Table table = new Table();

foreach(DataRow dataRow in dataTable.Rows)
{
  TableRow row = new TableRow();
  table.Rows.Add(row);
  osv.....
}

du kunne så lægge din datatable i session - f.eks.:

if(!IsPostBack)
{
  SessionData = GetData();
}

og så have sådan en her:

protected DataTable SessionData
{
  get{return Session["data"];}
  set{Session["data"] = value;}
}

... ved ikke om det var en lidt for ustruktureret forklaring... du bare sige til hvis du vil have det uddybet :o)

mvh
Avatar billede testpilot_dk Nybegynder
10. december 2005 - 17:20 #17
jeg har ikke nogen dataTable, men det ville måske være en god idee at lægge de indtastede data ind der, inden jeg foretager mine handlinger, så ville det også være unødvedigt at holde styr på mine controls senere

Men du må gerne lige uddybe lidt
Avatar billede snepnet Nybegynder
10. december 2005 - 17:44 #18
mmm... det er rasende let at vise sådan noget som du har der, hvadenter du vil gøre det programmatisk eller deklarativt.

hvis du prøver at sætte et DataGrid ind på siden istedet for en tabel - kan du lave dette lille forsøg:

// et datagrid på siden:
<asp:DataGrid id="grid" runat="server" />

// for eksemplet kan vi sige at du gerne vil vise en række af personer på siden:

public class Person
{
  private string _name;
  private int _age;

  public string Name
  {
    get{return _name;}
  }

  public int Age
  {
    get{return _age;}
  }

  public Person(string name, int age)
  {
    _name = name;
    _age = age;
  }
}

// i page_load
if(!IsPostBack)
{
  this.grid.DataSource = GetData();
  this.grid.DataBind(); 
}

// og en metode der kan stikke dig lidt data
private ArrayList GetData()
{
  ArrayList list = new ArrayList();
  list.Add(new Person("henning", 30);
  list.Add(new Person("bente", 24);
  list.Add(new Person("keld", 40);
  return list;
}

læg mærke til at listen viser dig de properties du har på personklassen, og at du ikke skal gøre noget for at den bliver vist ved efterfølgende postback's.
(og at du derfor ikke nødvendigvis bliver nødt til at gemme dine data i session ell.)

ovenstående er så et eksempel på databinding ved brug af de medfølgende kontroller.

mht. til det med at gemme dine data i session etc. så ville det i ovenstående

... hvis du bruger version 2.0 har du endnu bedre muligheder.

mvh
Avatar billede testpilot_dk Nybegynder
10. december 2005 - 17:59 #19
jeg har kun version 1.1!

Hvordna tilføjer jeg så til denne, og kan jeg smide textbox og sådan ind i det også
Avatar billede snepnet Nybegynder
10. december 2005 - 18:08 #20
du tilføjer til den ved at tilføje i dit datagrundlag - i ovenstående tilfælde til arraylisten.
og jeps - du kan sætte alt hvad du har lyst til ind i cellerne.
mvh
Avatar billede testpilot_dk Nybegynder
10. december 2005 - 18:13 #21
okay, ddet lyder faktisk smadder smart! det vil jeg kraftigt overveje!
Avatar billede snepnet Nybegynder
10. december 2005 - 18:15 #22
det er ikke uden evner - bestemt værd at kigge lidt på.
mvh
Avatar billede testpilot_dk Nybegynder
10. december 2005 - 21:31 #23
Kan man sætte DataTable og Table = hinanden!

hvis jeg nu ønsker at benytte samme struktur ???
Avatar billede snepnet Nybegynder
10. december 2005 - 22:53 #24
nej det er ikke en mulighed, men et datagrid viser dig pr. default alt hvad der er i en datatable, hvis du databinder til den.
mvh
Avatar billede testpilot_dk Nybegynder
11. december 2005 - 19:43 #25
Hej! nu har jeg lige sat mig og kigget på de der datagrid, hvordan får jeg en textbox ind i dem også! det kan jeg ikke helt lure
Avatar billede snepnet Nybegynder
11. december 2005 - 19:51 #26
det kan du gøre på flere måder - f.eks. ved en template:

<asp:DataGrid ID="grid" runat="server" AutoGenerateColumns="false">
<Columns>
  <asp:TemplateColumn>
    <ItemTemplate>
      <asp:TextBox ID="txtText" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "Text") %>'></asp:Label>
    </ItemTemplate>
  </asp:TemplateColumn>
</Columns>
<asp:DataGrid>

ovenstående forudsætter så at du i dit datagrundlag har en property der hedder Text.

mvh
Avatar billede testpilot_dk Nybegynder
11. december 2005 - 19:53 #27
Hvis vi tager dit eksempel, højere oppe, hvordan lægger jeg dem så ind dynamisk
Avatar billede snepnet Nybegynder
11. december 2005 - 20:30 #28
igen noget der er flere veje til - du kan tage udgangspunkt her.... der er links til hvad som helst omkring datagrids:

http://www.datagridgirl.com/articles.aspx

det er meget typisk at arbejde med griddet i forbindelse med at du binder data til det, og du har et event du kan abbonere på i den forbindelse (ItemDataBound).

f.eks. kan du gøre sådan noget i denne stil:

protected void grid_ItemDataBound(object sender, DataGridItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
        TextBox tb = new TextBox();
        tb.Text = "blah";
        e.Item.Cells[x].Controls.Add(tb);
    }
}

dynamisk tilføjelse af kolonner efter eget valg vil du typisk gøre ved at instantiere dig en template, som i det tilfælde vil være en type du selv har defineret, og som implementerer interfacet ITemplate.

f.eks. noget i denne stil:

// din template:
public class SomeTemplate : ITemplate
{
    public void InstantiateIn(Control container)
    {
        container.Controls.Add(new TextBox());
    }
}

// og der hvor du tilføjer den
TemplateColumn tc = new TemplateColumn();
tc.ItemTemplate = new SomeTemplate();
someGrid.Columns.Add(tc);

ovenstående vil naturligvis ikke kunne bruges til noget særligt, da der bare bliver indsat en ikke-databunden tekstboks, men det skulle gerne vise princippet.

du kan self. godt få fat i dine data i forbindelse med databinding fra dine custom templates - f.eks. med sådan noget i denne stil:

public class SomeTemplate : ITemplate
{
    private string _property;

    public SomeTemplate(string property)
    {
        _property = property;
    }

    public void InstantiateIn(Control container)
    {
        TextBox tb = new TextBox();
        tb.DataBinding += new EventHandler(tb_DataBinding);
        container.Controls.Add(tb);
    }

    void tb_DataBinding(object sender, EventArgs e)
    {
        TextBox tb = sender as TextBox;
        DataGridItem item = tb.Parent.NamingContainer as DataGridItem;

        if (tb != null && item != null)
        {
            tb.Text = DataBinder.GetPropertyValue(item.DataItem, _property).ToString();
        }
    }
}

ovenstående kræver så, at du fortæller din template hvor den skal finde sine data:
TemplateColumn tc = new TemplateColumn();
tc.ItemTemplate = new SomeTemplate("Name");
this.grid.Columns.Add(tc);

så skulle du vist have lidt at gå videre med ;o)

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