webForumDet fria alternativet

Property-problem

.NET

9 svar · 741 visningar · startad av stolpskottet

Medlem sedan mars 200527 inlägg
Frågan#1

Jag har två usercontrols i en sida, i den ena har jag en dropdownlist och i den andra en repeater.
Nu skulle jag vilja visa olika data i repeatern på den andra usercontrolen utifrån värdet på den första usercontrolens dropdownlist.

Jag har kommit en bit på vägen och det fungerar hyfsat men värdet från dropdownen släpar och repeatern visar alltid värdet från föregående val i dropdownlisten.

Nån som sitter inne med en bra lösning för att få repeatern att visa rätt data direkt man byter värde på dropdownlisten?

Usercontrol med dropdown:

<%@ Control Language="VB"  %>

<script runat="server">
   Public ReadOnly Property tabell() As String
        Get
            Return dropdownlist.SelectedItem.ToString
        End Get
    End Property
</script>

Usercontrol med repeater:

<%@ Control Language="VB"  %>

<script runat="server">
    Public WriteOnly Property tabell() As String
        Set(ByVal value As String)
            rp1.DataSource = objDatabas.visabocht(value)
            rp1.DataBind()
        End Set
    End Property
</script>

aspx-sidan:

<script runat="server">
    Sub page_load(ByVal obj As Object, ByVal e As EventArgs)
        If sok.tabell <> "" Then
            visa.tabell = sok.tabell
        End If
    End Sub
</script>
Medlem sedan dec. 19995 874 inlägg
#2

Lägg ett event på din UC med dropdownen.
Populera sedan din rpt property när eventet triggas.
Du kan exempelvis låta aspx-sidan penumerera på eventet.

Medlem sedan mars 200527 inlägg
#3

Okej, låter ju exakt som vad jag är ute efter. men hur populerar jag en property vid ett event? och vad innebär att prenumerera(antar att det är vad som ska stå) på ett event?

Medlem sedan dec. 19995 874 inlägg
#4

I din DDL-kontroll skapar du ett event, och låter det triggas på indexChange.

public event EventHandler DropDownListUpdated;
private void myDdl_SelectedIndexChanged(object sender, System.EventArgs e){
     DropDownListUpdated("myDdl", null);
}

I din aspx-sida, så lägger du till eventet

this.myDdlControl.DropDownListUpdated += new EventHandler(ddl_Updated);
protected void ddl_Updated(object sender, EventArgs e)
{
	myRptControl.DataSource = newDataSource;
	myRptControl.Bind();
}

När eventet triggas fårn din ddl-kontroll så lägger du på en ny datakälla och binder om den.
Propertyn DataSource får du således exponera från din repeaterkontroll. Likaså kan du behöva bygga en Bind-metod, som binder din datakälla till repeatern.

Medlem sedan mars 200527 inlägg
#5

Har suttit och kliat mig i huvet ett tag nu.. men det blev lite för svårt när jag ska försöka översätta det där till vb som jag är van vid. Kan du utveckla lite mer?

Medlem sedan mars 200527 inlägg
#6

Nu har jag fått till det med dina bitar i c#, stort tack för dom, fungerar sjukt bra och snabbt.
Men som sagt jag skulle vilja kunna göra samma sak helt i VB, är det möjligt??

nu ser det ut såhär:

aspx-sida:

<%@ Page Language="C#" %>
<%@ Register TagPrefix="m" TagName="sok" Src="test_sok.ascx" %>
<%@ Register TagPrefix="m" TagName="visa" Src="test_visa.ascx" %>

<script runat="server">
    void page_load(object sender, EventArgs e){
        this.sok.DropDownListUpdated += new EventHandler(ddl_Updated);
    }
    
    protected void ddl_Updated(object sender, EventArgs e){
        DropDownList dd = (DropDownList)sender;
        visa.tabell = dd.SelectedValue; 
    }
</script>    
<html>
<body>
    <form id="form1" runat="server">
    <m:sok ID="sok" runat="server" />
    <m:visa ID="visa" runat="server" />
    </form>
</body>
</html>

test_sok.ascx:

<%@ Control Language="C#" %>

<script runat="server">
    public event EventHandler DropDownListUpdated;
    private void ddl_val_SelectedIndexChanged(object sender, System.EventArgs e)
    {
        DropDownListUpdated(ddl_val, null);
    }
</script>
.
.
.

test_visa.ascx

<%@ Control Language="VB" %>

<script runat="server">
    Dim objDatabas As New GF.databas
    Public WriteOnly Property tabell() As String
        Set(ByVal value As String)
            dg1.DataSource = objDatabas.visabocht(value)
            dg1.DataBind()
        End Set
    End Property
</script>
.
.
.
Medlem sedan dec. 19995 874 inlägg
#7

Det kan du naturligtvis.

Gå gärna igenom denna 'guide', som kan hjälpa dig konvertera c# till vb.net
http://www.harding.edu/USER/fmccown/WWW/vbnet_csharp_comparison.html

Medlem sedan mars 200527 inlägg
#8

Fint, var 'raiseevent' och 'addhandler' jag saknade i min vb-kod :r

Medlem sedan okt. 20041 556 inlägg
Medlem sedan mars 200527 inlägg
#10

Jo, men hur lärorikt är det.. bättre om man får läsa och fundera lite ;)

261 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)
130 ms — ändringar (db)