webForumDet fria alternativet

Property-problem

9 svar · 739 visningar · startad av stolpskottet

stolpskottetMedlem sedan mars 200527 inlägg
#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>
BrimbaMedlem sedan dec. 19995 875 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.

stolpskottetMedlem 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?

BrimbaMedlem sedan dec. 19995 875 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.

stolpskottetMedlem 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?

stolpskottetMedlem 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>
.
.
.
BrimbaMedlem sedan dec. 19995 875 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

stolpskottetMedlem sedan mars 200527 inlägg
#8

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

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

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

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