webForumDet fria alternativet

ASP.NET o DHTML ?

12 svar · 605 visningar · startad av ZeUs

ZeUsMedlem sedan nov. 200188 inlägg
#1

Tjo!
Jag har ett litet problem som jag inte vet hur jag ska lösa...

Jag vill göra en slags fold out. Som ni ser på länken ovan.. Under aktuella rapporter.

http://hem.hj.se/~dm01asan/xjobb/rapporter.htm

För tillfället har jag lös det genom en datagrid. Men det är inte säkert att jag kommer att kunna använda den.

Varje support ärende har en flagga, den beror på var i supportkedjan ett ärende befinner sig. Om flagga = 4 så befinner sig ärendet i sista steget i kedjan och därför dyker 4:a länkar upp. Om flagga=1 så syns bara en länk osv.
Då vill jag att man ska kunna klicka på ärendenamnet exempelvis "Kan inte spara sidan".
Då ska det dyka upp länkar en nivå ner så man kan titta på det dokument som hör till steget. Under nivån måste därför vara dynamisk.

Vet inte hur jag ska lösa detta i asp.net. Lager?
Kan man fylla lager med data från databasen som hör till resp. ärende. Om man klickar på länken så viks de ut och länken under "flyter" ner?

Hmm, fick jag till det där? Hoppas ni förstår vad jag menar...

fredrikMedlem sedan dec. 19991 072 inlägg
#2

Vet inte om jag är med till 100%...men men...

Du kan ju om du vill skapa <span> som du redan från början "fyller på" med den data som hör till. Sen kan du ändra dess "display"-attribut till "block" tror jag att det är så "puttar" den ner all annan info...Det är DHTML-varianten...

...men varför kan du inte använda dig av vanliga postbacks?

Om din data tex. ligger i en "DataList" så kan du ju använda "SelectedItemTemplate" för att visa hur "Selected" data ska visas upp.
Du lägger helt enkelt ut rubriken som en "LinkButton" tex vars "Click" du fångar upp. Därefter sätter du DataList.ens "SelectedIndex" till det du klickade på.
Om du behöver mer struktuerade info kan du ju tom. lägga ytterligare en DataList/Repeater i din "SelectedItemTemplate".

DinoMedlem sedan sep. 20011 914 inlägg
#3

Gjorde en liknade sak för någon vecka sen. Se om du kan få ut något av detta.

        <script type="text/javascript" language="javascript">
            function ChangePanelState(e1, e2){
                var div = document.getElementById(e1);
                var lb = document.getElementById(e2);
                if(div.style.display == 'none'){
                    div.style.display = 'block';
                    lb.innerText = '6';
                }else{
                    div.style.display = 'none'
                    lb.innerText = '4';
                }
            }
        </script>
        <asp:repeater id="repGrr" runat="server">
            <headertemplate>
                <table align="center" cellspacing="0" cellpadding="3" width="450">
                    <tr>
                        <td colspan="2" bgcolor="Orange"><span style="font-size: 16px; font-weight: bold;">Aktuella rapporter</span></td>
                    </tr>
            </headertemplate>
            <itemtemplate>
                    <tr>
                        <td bgcolor="beige">
                            <asp:label id="lbMarker" font-name="Webdings" text="4" runat="server" />
                            <asp:hyperlink id="hpGrr" navigateurl="#" runat="server" />
                            <asp:panel id="pnlGrr" style="display: none;" runat="server">
                                <ul>
                                    <asp:placeholder id="phLi" runat="server" />
                                </ul>
                            </asp:panel>
                        </td>
                    </tr>
            </itemtemplate>
            <footertemplate>
                </table>
            </footertemplate>
        </asp:repeater>
        protected Repeater repGrr;
        private void Page_Load(object sender, System.EventArgs e)
        {
            if(!IsPostBack)
            {
                BindRepeater();
            }
        }

        private void BindRepeater()
        {
            repGrr.DataSource = //hämta din datakälla
            repGrr.DataBind();
        }

        private void repGrr_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {
            if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
            {
                DinDataKälla di = (Dindatakällatyp)e.Item.DataItem;

                string pnl = ((Panel)e.Item.FindControl("pnlGrr")).UniqueID.Replace(":", "_");
                string lb = ((Label)e.Item.FindControl("lbMarker")).UniqueID.Replace(":", "_");
                
                HyperLink hp = (HyperLink)e.Item.FindControl("hpGrr");
                hp.Text = di.HuvudText;
                hp.Attributes.Add("onclick", "ChangePanelState('" + pnl + "', '" + lb + "')");

                PlaceHolder ph = (PlaceHolder)e.Item.FindControl("phLi");
                
                foreach(Aternativ a in dindatakälla)
                {
                    HyperLink hpItem = new HyperLink();
                    hpItem.Target = "_blank";
                    hpItem.Text = cbs.ItemTitle;
                    hpItem.NavigateUrl = cbs.ItemLink;
                    ph.Controls.Add(new LiteralControl("<li>"));
                    ph.Controls.Add(hpItem);
                    ph.Controls.Add(new LiteralControl("</li>"));
                }
            }
        }
ZeUsMedlem sedan nov. 200188 inlägg
#4

tackar.. jag ska prova era förslag...
Men jag får inte igång sql servern för tillfället

NöffMedlem sedan nov. 2003569 inlägg
#5

jag tror jag vet vad du är ute efter. Du vill alltså ha nån slags trädstruktur, och gruppera datat?. Då ska du göra nästlade Datalists/Repeater/DataGrids.

ZeUsMedlem sedan nov. 200188 inlägg
#6

Aha, jag ska sätta mig ner och testa imorgon på företaget där vi har vår "riktiga" utvecklingsmiljö... Håller på med exjobbet

ZeUsMedlem sedan nov. 200188 inlägg
#7

Jag skulle behöva hjälp att översätta Dinos kod till VB...
hänger inte med på det här:

private void repGrr_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {
            if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
            {
                DinDataKälla di = (Dindatakällatyp)e.Item.DataItem;

                string pnl = ((Panel)e.Item.FindControl("pnlGrr")).UniqueID.Replace(":", "_");
                string lb = ((Label)e.Item.FindControl("lbMarker")).UniqueID.Replace(":", "_");
                
                HyperLink hp = (HyperLink)e.Item.FindControl("hpGrr");
                hp.Text = di.HuvudText;
                hp.Attributes.Add("onclick", "ChangePanelState('" + pnl + "', '" + lb + "')");

                PlaceHolder ph = (PlaceHolder)e.Item.FindControl("phLi");
                
                foreach(Aternativ a in dindatakälla)
                {
                    HyperLink hpItem = new HyperLink();
                    hpItem.Target = "_blank";
                    hpItem.Text = cbs.ItemTitle;
                    hpItem.NavigateUrl = cbs.ItemLink;
                    ph.Controls.Add(new LiteralControl("<li>"));
                    ph.Controls.Add(hpItem);
                    ph.Controls.Add(new LiteralControl("</li>"));
                }
            }
        }
DinoMedlem sedan sep. 20011 914 inlägg
#8

vb.net kod.

sub repGrr_ItemDataBound(sender as object, e as RepeaterItemEventArgs) handles repGrr.ItemDataBound
   If (e.Item.ItemType = ListItemType.Item) Or (e.Item.ItemType = ListItemType.AlternatingItem) Then
      Dim di as dindatakälla = DirectCast(e.Item.DataItem, dindatakälla)
      
      Dim pnl as string = DirectCast(e.Item.FindControl("pnlGrr"), Panel)")).UniqueID.Replace(":", "_")
      Dim lb as string = DirectCast(e.Item.FindControl("lbMarker"), Label)")).UniqueID.Replace(":", "_")

      Dim hp as HyperLink = DirectCast(e.Item.FindControl("lbMarker"), HyperLink)
      with hp
         .Text = di.HuvudText
         .Attributes.Add("onclick", "ChangePanelState('" + pnl + "', '" + lb + "')")
      end with

      Dim ph as PlaceHolder = DirectCast(e.Item.FindControl("phLi"), PlaceHolder)

      For Each Alternativ As string In delavdindatakällasomhålleralternativen
         Dim hpItem as new HyperLink()
         with hpItem
            .Target = "_blank"
            .Text = Alternativ.ItemTitle
            .NavigateUrl = Alternativ.ItemLink
         end with
         ph.Controls.Add(new LiteralControl("<li>"));
         ph.Controls.Add(hpItem);
         ph.Controls.Add(new LiteralControl("</li>"));
      Next
   end if
end sub
ZeUsMedlem sedan nov. 200188 inlägg
#9

Tack för hjälpen.. Hann lösa det själv innan... Grym lösning av dig.. Den kom till stor användning! Funkar super, precis vad jag letade efter.

Jag ändrade lite i koden för att få den att fungera.. Vet inte om jag borde ha gjort på nåt annat sätt... Men det funkar iaf

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        If Not IsPostBack Then
            BindRepeater()
        End If
    End Sub
    Private Sub BindRepeater()
        repGrr.DataSource = GetSupportDataSet()
        repGrr.DataBind()
    End Sub
    Private Sub repGrr_ItemDataBound(ByVal sender As System.Object, ByVal e As RepeaterItemEventArgs) Handles repGrr.ItemDataBound
        If (e.Item.ItemType = ListItemType.Item) Or (e.Item.ItemType = ListItemType.AlternatingItem) Then
            Dim di As DataRowView
            di = e.Item.DataItem
            Dim dv As DataView = New DataView(GetSupportDataSet().Tables("support"))
            Dim dt As DataTable

            'Dim di As New CType(e.Item.DataItem, ds)
            'DinDataKälla di = (Dindatakällatyp)e.Item.DataItem;
            'HyperLink(hp = CType(e.Item.FindControl("hpGrr"), HyperLink))

            'string pnl = ((Panel)e.Item.FindControl("pnlGrr")).UniqueID.Replace(":", "_");
            Dim pnl As String = CType(e.Item.FindControl("pnlGrr"), Panel).UniqueID.Replace(":", "_")
            'string lb = ((Label)e.Item.FindControl("lbMarker")).UniqueID.Replace(":", "_");
            Dim lb As String = CType(e.Item.FindControl("lbMarker"), Label).UniqueID.Replace(":", "_")
            Dim hp As HyperLink = CType(e.Item.FindControl("hpGrr"), HyperLink)
            hp.Text = di.Item(1)
            hp.Attributes.Add("onclick", "ChangePanelState('" + pnl + "', '" + lb + "')")

            Dim ph As PlaceHolder = CType(e.Item.FindControl("phLi"), PlaceHolder)

            'For Each di In dv
            Dim hpItem As New HyperLink
            Dim hpItem2 As New HyperLink
            Dim flagga As Integer
            hpItem.Target = "_blank"
            'hpItem.Text = di.Item(0) 'cbs.ItemTitle
            flagga = di.Item(3)
            Select Case flagga
                Case Is < 3
                    hpItem.Text = "Ej upptagen i supportprocessen"
                    hpItem.NavigateUrl = "Oversikt.aspx?id=" & di.Item(0) 'cbs.ItemLink
                    ph.Controls.Add(New LiteralControl("<li>"))
                    ph.Controls.Add(hpItem)
                    ph.Controls.Add(New LiteralControl("</li>"))
                Case 4
                    hpItem.Text = "Fas 2, Analys & Felsök"
                    hpItem.NavigateUrl = "Oversikt.aspx?id=" & di.Item(0) 'cbs.ItemLink
                    ph.Controls.Add(New LiteralControl("<li>"))
                    ph.Controls.Add(hpItem)
                    ph.Controls.Add(New LiteralControl("</li>"))
                Case 5
                    hpItem.Text = "Fas2, Analy & Felsök"
                    hpItem.NavigateUrl = "Oversikt.aspx?id=" & di.Item(0) 'cbs.ItemLink
                    ph.Controls.Add(New LiteralControl("<li>"))
                    ph.Controls.Add(hpItem)
                    ph.Controls.Add(New LiteralControl("</li>"))
                    hpItem2.Text = "Fas3, Godkännande av kund"
                    hpItem2.NavigateUrl = "Oversikt.aspx?id=" & di.Item(0) 'cbs.ItemLink
                    ph.Controls.Add(New LiteralControl("<li>"))
                    ph.Controls.Add(hpItem2)
                    ph.Controls.Add(New LiteralControl("</li>"))
                Case Else
                    hpItem.Text = "Nåt annat"
                    hpItem2.NavigateUrl = "Oversikt.aspx?id=" & di.Item(0) 'cbs.ItemLink
                    ph.Controls.Add(New LiteralControl("<li>"))
                    ph.Controls.Add(hpItem)
                    ph.Controls.Add(New LiteralControl("</li>"))
            End Select

            'Next
        End If
    End Sub
    Public Function GetSupportDataSet() As DataSet
        Dim ds As New DataSet
        Dim cmd As New SqlCommand("select_support", Application("strConn"))
        Dim adpt As New SqlDataAdapter(cmd)
        Application("strConn").open()
        cmd.CommandType = CommandType.StoredProcedure
        cmd.Parameters.Add("@employee_id", SqlDbType.Int, 4).Value = 2
        cmd.Parameters.Add("@company_id", SqlDbType.Int, 4).Value = 2
        adpt.Fill(ds, "support")
        Application("strConn").close()
        Return ds
    End Function

Inte helt klar.. behöver snyggas till lite..

GladhMedlem sedan maj 20012 812 inlägg
#10

Bara en lite försköning av koden, du har en massa reperativ kod i din case sats, det fungerar så, men är dålig ur underhålls syfte eftersom man måste ändra på mer än ett ställe, vilket kan leda till att man glömmer att ändra på någotställe och det ställer till problem

Testa att skriva om din case sats till något sånt här:

            hpItem.NavigateUrl = "Oversikt.aspx?id=" & di.Item(0) 'cbs.ItemLink
            ph.Controls.Add(New LiteralControl("<li>"))
            ph.Controls.Add(hpItem)
            ph.Controls.Add(New LiteralControl("</li>"))

            Select Case flagga
                Case Is < 3
                    hpItem.Text = "Ej upptagen i supportprocessen"
                Case 4
                    hpItem.Text = "Fas 2, Analys & Felsök"
                Case 5
                     .
                     .
                     .

- Magnus

ZeUsMedlem sedan nov. 200188 inlägg
#11

Grejjen är juh den att antalet länkar varierar.. Så i steg fyra ska det vara 3 länkar... Då måste jag väl ha 3 olika hpItem..
Därför jag gjort sådär..
Eller kan man ha samma?

GladhMedlem sedan maj 20012 812 inlägg
#12

Nej du kan inte ha samma. I steg fyra så får du skapa 2 nya länkar och lägga till dem.

Men för de case som ha samma antal, så kan du minimera din.

- Magnus

ZeUsMedlem sedan nov. 200188 inlägg
#13

Okej.. Då gör jag det.. Tack för tipset..
Kanske skulle lägga ut

                    hpItem.Text = "Nåt annat"
                    hpItem2.NavigateUrl = "Oversikt.aspx?id=" & di.Item(0) 'cbs.ItemLink
                    ph.Controls.Add(New LiteralControl("<li>"))
                    ph.Controls.Add(hpItem)
                    ph.Controls.Add(New LiteralControl("</li>"))

I en funktion.. Eller vad tror ni?

138 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
136 ms — hämta tråd, inlägg och bilagor (db)