Avatar billede testpilot_dk Nybegynder
02. december 2007 - 12:16 Der er 7 kommentarer og
2 løsninger

tabel og kontroller

Hej!

Jeg sidder og roder med tabeller og dynamisk indsættelse af kontroller i tabellen.

  Det lykkes også for mig, men den kalder ikke mine events som jeg forventer den gør, nogen som har en ide til hvad der er forkert her.
  ASP.net koden
---------------------------------------
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="WeekdaysMenu.aspx.cs" Inherits="Menu_WeekdaysMenu" %>

<!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>
    <link href="../styles/main_styles.css" rel="stylesheet" type="text/css" />
    <link href="../styles/scroolbars.css" rel="stylesheet" type="text/css" />
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:DropDownList ID="DropDownList1" runat="server" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged"
            Width="366px" AutoPostBack="True">
        </asp:DropDownList>
        &nbsp; &nbsp;
        <asp:Label ID="Label1" runat="server" CssClass=".H1" Font-Size="X-Large" Height="34px"
            Style="z-index: 100; left: 18px; position: absolute; top: 7px" Width="363px"></asp:Label>
   
    </div>
        <asp:Table ID="Table1" runat="server" Height="22px" Style="left: 9px; position: relative;
            top: 12px; z-index: 101;" Width="359px">
        </asp:Table>
        &nbsp;&nbsp;
    </form>
</body>
</html>

CS Koden
----------------------------------------
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;
using System.Globalization;

public partial class Menu_WeekdaysMenu : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            FillDropDown();
            FillTable(Menu_Feeder.Instance().GetDay());
            this.DropDownList1.SelectedValue = GetDayValue(Menu_Feeder.Instance().GetDay()).ToString();
            this.Label1.Text = "Menuen " + Menu_Feeder.Instance().GetDay();
        }
        else
        {
            FillTable(Convert.ToString(this.DropDownList1.SelectedItem));
            this.Label1.Text = "Menuen " + this.DropDownList1.SelectedItem;
        }
    }

    public void FillDropDown()
    {
        CultureInfo ci = new CultureInfo("da-DK");
        DateTimeFormatInfo dtfi = ci.DateTimeFormat;
        this.DropDownList1.Items.Add(new ListItem(dtfi.GetDayName(DayOfWeek.Monday), "0"));
        this.DropDownList1.Items.Add(new ListItem(dtfi.GetDayName(DayOfWeek.Tuesday), "1"));
        this.DropDownList1.Items.Add(new ListItem(dtfi.GetDayName(DayOfWeek.Wednesday), "2"));
        this.DropDownList1.Items.Add(new ListItem(dtfi.GetDayName(DayOfWeek.Thursday), "3"));
        this.DropDownList1.Items.Add(new ListItem(dtfi.GetDayName(DayOfWeek.Friday), "4"));
        this.DropDownList1.Items.Add(new ListItem(dtfi.GetDayName(DayOfWeek.Saturday), "5"));
        this.DropDownList1.Items.Add(new ListItem(dtfi.GetDayName(DayOfWeek.Sunday), "6"));     
    }

    public int GetDayValue(string name)
    {
        foreach (ListItem li in this.DropDownList1.Items)
        {
            if (li.Text == name)
                return Convert.ToInt32(li.Value);
        }

        return -1;
    }

    public void FillTable(string day)
    {
        Selector.Instance().OpenDatabase();
        IDataReader reader = null;
        switch (day)
        {
            case "mandag":
                reader = Selector.Instance().Select_MenuCard(DayOfWeek.Monday.ToString());
                break;
            case "tirsdag":
                reader = Selector.Instance().Select_MenuCard(DayOfWeek.Tuesday.ToString());
                break;
            case "onsdag":
                reader = Selector.Instance().Select_MenuCard(DayOfWeek.Wednesday.ToString());
                break;
            case "torsdag":
                reader = Selector.Instance().Select_MenuCard(DayOfWeek.Thursday.ToString());
                break;
            case "fredag":
                reader = Selector.Instance().Select_MenuCard(DayOfWeek.Friday.ToString());
                break;
            case "lørdag":
                reader = Selector.Instance().Select_MenuCard(DayOfWeek.Saturday.ToString());
                break;
            case "søndag":
                reader = Selector.Instance().Select_MenuCard(DayOfWeek.Sunday.ToString());
                break;
        }
        if (reader != null)
        {
            TranslatorClass tc = new TranslatorClass();
            while (reader.Read())
            {
                TableCell tc_header = new TableCell();
                TableRow tr_header = new TableRow();

                tc_header.Text = reader["Menu"].ToString();
                tr_header.Cells.Add(tc_header);
                this.Table1.Rows.Add(tr_header);

                TableCell tc_description = new TableCell();
                TableRow tr_description = new TableRow();

                tc_description.Text =  tc.MakeBoldWords(reader["Description"].ToString()) + " for " + reader["Price"].ToString();
                tr_description.Cells.Add(tc_description);
                this.Table1.Rows.Add(tr_description);
            }

            TableCell tc_dropdown = new TableCell();
            TableRow tr_dropdown = new TableRow();

            this.DropDownList1.SelectedIndexChanged += new EventHandler(DropDownList1_SelectedIndexChanged);
            this.DropDownList1.EnableViewState = true;
            tc_dropdown.Controls.Add(this.DropDownList1);
           
            tr_dropdown.Cells.Add(tc_dropdown);
            this.Table1.Rows.Add(tr_dropdown);
        }

        Selector.Instance().CloseDatabase();
    }
    protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
    {
        FillTable(this.DropDownList1.SelectedItem.Text);
    }
}

Jeg forventede at når min dropdownliste i tabellen blev ændret skulle den kalde DropDownList1_SelectedIndexChanged()

Men det gør den ikke
Avatar billede neoman Novice
02. december 2007 - 14:39 #1
Jeg r på vej ud af døren og kan ikke teste men:


Du propper din DDL ind i en tabelcelle, og DDL'ens ClientID er derfor bestemt af tabelcellens ID. Når du klikker på den, så laves der postback, og derpå page load, og først derpå skal  eventhandleren køre. Det vil den kun gøre hvis din DDL stadig hedder det samme på klienten efter den nye page load.

Du kan teste teorien ved at kigge i source oden på klienten inden du klikker på din ddl, og derpå efter klikket, og se om din DDL hedder det samme derinde.

Jeg ville prøve at tilskrive et ID til den celle som DDL'en sidder i :

tc_dropdown.ID = "minDropdown"

I øvrigt er det altid en god idé at tilskrive eksplicitte id'er til dunamsike kontroller (og tabelceller) , så undgår man bøvl med matching af viewstate, hvis antallet af rækker mindskes efter postback.

Du kan læse lidt om den slags her : http://www.eksperten.dk/artikler/1103
Avatar billede testpilot_dk Nybegynder
02. december 2007 - 14:57 #2
hmm, okay!

Er ikke helt iskker på at jeg forstår det!

  Håber du har tid til at lave et eksempel.

Dropdownlisten er bygget inden runtime, jeg sætter bare dropdownlisten som en control i min celle.
Avatar billede neoman Novice
02. december 2007 - 14:59 #3
FillTable(Convert.ToString(this.DropDownList1.SelectedItem)); er også lidt mistænkelig. Nu har du gjort det på en måde som jeg ikke har prøvet: at deklarativt lave en kontorl, men så dynamisk flytte dens position i kontroltræet ved at tilskrive den til en anden kontrol. Det som virker for mig er enten at have deklarative kontroller, eller at tilføje dem dynamisk - ved ikke hvordan systemet tackler det du har gjort:

Du forespørger på en værdi af en kontrol som dynamisk bliver sat inde i en anden kontrol - er ikke 100 på at den faktisk er tilgængelig på den måde (altså ved pageload ved postback, hvor den endnu ikke er flyttet ind i tabelcellen). KOntroller som sidder i andre kontroller skal normalt FincControl'es:

(DropDownList))MyTable.TableRow(rowIndex).Cells(cellIndex).FindControl("ControlName").SelectedIndex

osv osv.
Avatar billede testpilot_dk Nybegynder
02. december 2007 - 15:10 #4
Hmm, det er self rigtigt!

  Men min table er tom ved PostBack, hvordan undgår jeg det ?
Avatar billede testpilot_dk Nybegynder
03. december 2007 - 15:36 #5
er det sådan du kan lave et eksempel på det ???

  Jeg kan ikke få den til at gøre det korrekt.
Avatar billede neoman Novice
05. december 2007 - 19:06 #6
nope - er sku for hængt op:-(. læs det link jeg gav dig forfra og spørg specifikt, hvis der er noget du ikke forstår.

generelt: din kontrol får sin viewstate tilbage normalt, men så skal kontrollen have samme ID. DIn DDL gemmer først sin viewstate når den er oprettet inde i tabellen. Og dvs du kan ikke læse fra den før den igen sidder inde i tabellen.

Du kan mao ikke oprette en tabel med din DDL i, men hvor oprettelsen af tabellen afhænger af hvad der er valgt i din DDL. Du kan tilgengæld få fat i dens værdi i Request.Form, og på baggrund heraf danne tabellen i Page Load.

Hvis noget er uklart sig præcist HVAD, og så kan jeg eller en anden hjælpe dig. Mao: "Jeg forstår ikke" duer ikke. "Jeg forstår ikke hvad det betyder at XX skal YY" er noget man kan svare på.
Avatar billede testpilot_dk Nybegynder
05. december 2007 - 19:21 #7
hej! jeg tror jeg har fundet ud af det.

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;
using System.Globalization;
using System.Drawing;

public partial class Menu_WeekdaysMenu : System.Web.UI.Page
{
    private Table _Table = null;
    private DropDownList _Dropdown = null;

    private TranslatorClass tc = new TranslatorClass();

    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);

        FillDropDown();
        FillTable(Menu_Feeder.Instance().GetDay());
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            this._Dropdown.SelectedIndex = Convert.ToInt32(DateTime.Now.DayOfWeek) - 1;
            this.Label1.Text = tc.MakeFirstLetterUpperCase(Menu_Feeder.Instance().GetDay() + "ens Menu");
        }
        else
            this.Label1.Text = tc.MakeFirstLetterUpperCase(this._Dropdown.SelectedItem.Text + "ens Menu");
    }

    public void FillBoth()
    {
        //FillDropDown();
        FillTable(((DropDownList)FindControl("drp")).SelectedItem.Text);
    }

    public void FillDropDown()
    {
        _Dropdown = new DropDownList();
        _Dropdown.EnableViewState = true;
        _Dropdown.AutoPostBack = true;
        _Dropdown.SelectedIndexChanged += new EventHandler(_Dropdown_SelectedIndexChanged);
        _Dropdown.ID = "drp";
        _Dropdown.Attributes.Add("runat", "server");
        _Dropdown.EnableViewState = true;

        CultureInfo ci = new CultureInfo("da-DK");
        DateTimeFormatInfo dtfi = ci.DateTimeFormat;
        this._Dropdown.Items.Add(new ListItem(dtfi.GetDayName(DayOfWeek.Monday), "1"));
        this._Dropdown.Items.Add(new ListItem(dtfi.GetDayName(DayOfWeek.Tuesday), "2"));
        this._Dropdown.Items.Add(new ListItem(dtfi.GetDayName(DayOfWeek.Wednesday), "3"));
        this._Dropdown.Items.Add(new ListItem(dtfi.GetDayName(DayOfWeek.Thursday), "4"));
        this._Dropdown.Items.Add(new ListItem(dtfi.GetDayName(DayOfWeek.Friday), "5"));
        this._Dropdown.Items.Add(new ListItem(dtfi.GetDayName(DayOfWeek.Saturday), "6"));
        this._Dropdown.Items.Add(new ListItem(dtfi.GetDayName(DayOfWeek.Sunday), "7"));

    }

    void _Dropdown_SelectedIndexChanged(object sender, EventArgs e)
    {
        FillBoth();
    }

    public int GetDayValue(string name)
    {
        foreach (ListItem li in this._Dropdown.Items)
        {
            if (li.Text == name)
                return Convert.ToInt32(li.Value);
        }

        return -1;
    }

    public void FillTable(string day)
    {
        _Table = new Table();
        _Table.Rows.Clear();
        Selector.Instance().OpenDatabase();
        IDataReader reader = null;
        switch (day)
        {
            case "mandag":
                reader = Selector.Instance().Select_MenuCard(DayOfWeek.Monday.ToString());
                break;
            case "tirsdag":
                reader = Selector.Instance().Select_MenuCard(DayOfWeek.Tuesday.ToString());
                break;
            case "onsdag":
                reader = Selector.Instance().Select_MenuCard(DayOfWeek.Wednesday.ToString());
                break;
            case "torsdag":
                reader = Selector.Instance().Select_MenuCard(DayOfWeek.Thursday.ToString());
                break;
            case "fredag":
                reader = Selector.Instance().Select_MenuCard(DayOfWeek.Friday.ToString());
                break;
            case "lørdag":
                reader = Selector.Instance().Select_MenuCard(DayOfWeek.Saturday.ToString());
                break;
            case "søndag":
                reader = Selector.Instance().Select_MenuCard(DayOfWeek.Sunday.ToString());
                break;
        }
        if (reader != null)
        {
            TranslatorClass tc = new TranslatorClass();
            while (reader.Read())
            {
                TableCell tc_header = new TableCell();
                TableRow tr_header = new TableRow();

                tc_header.Text = reader["Menu"].ToString();
                tc_header.ColumnSpan = 2;
                tr_header.Cells.Add(tc_header);
                this._Table.Rows.Add(tr_header);

                TableCell tc_description = new TableCell();
                TableRow tr_description = new TableRow();

                if (day == "fredag" || day == "lørdag")
                {
                    tc_description.Text = tc.MakeBoldWords(reader["Description"].ToString()) + "<br>";
                    tc_description.Text += reader["Price"].ToString() + "<br>";
                    tc_description.ColumnSpan = 2;
                    reader.Read();
                    tc_description.Text += reader["Price"].ToString();
                    tr_description.Cells.Add(tc_description);
                    this._Table.Rows.Add(tr_description);
                }
                else
                {
                    tc_description.Text = tc.MakeBoldWords(reader["Description"].ToString()) + " for " + reader["Price"].ToString();
                    tc_description.ColumnSpan = 2;
                    tr_description.Cells.Add(tc_description);
                    this._Table.Rows.Add(tr_description);
                }
            }

            TableCell tc_text = new TableCell();
            tc_text.Text = "Vælg anden dag: ";
            tc_text.Width = 150;
            TableCell tc_dropdown = new TableCell();
            TableRow tr_dropdown = new TableRow();

            tr_dropdown.Cells.Add(tc_text);
            tc_dropdown.Controls.Add(_Dropdown);

            tr_dropdown.Cells.Add(tc_dropdown);
            this._Table.Rows.Add(tr_dropdown);

            foreach (object item in Page.Controls)
            {
                if (item.GetType() == typeof(HtmlForm))
                {
                    for (int i = 0; i < ((HtmlForm)item).Controls.Count; i++)
                    {
                        if (((HtmlForm)item).Controls[i].ToString() == "System.Web.UI.WebControls.Table")
                            ((HtmlForm)item).Controls.RemoveAt(i);
                    }
                    ((HtmlForm)item).Controls.Add(_Table);
                    break;
                }
            }
        }

        Selector.Instance().CloseDatabase();
    }
}


Dette virker!
jeg har fjernet alt fra aspx filen

Send et svar, så deler vi point
Avatar billede neoman Novice
05. december 2007 - 22:24 #8
well done !:P
Avatar billede testpilot_dk Nybegynder
06. december 2007 - 09:40 #9
svar
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