Avatar billede gulbaek Nybegynder
09. maj 2006 - 11:59 Der er 22 kommentarer og
1 løsning

Kommunikation mellem user controls

Hejsa, lige et hurtigt spørgsmål, hvordan jeg kan kommunikere imellem 2 user controls?

Har en user control der indeholder mit søge felt og en anden der skal indeholde søge resultatet?

Bruger asp.net 2.0 og vil helst undgå i første omgang at benytte en querystring, da jeg lige vil teste muligheden for at benytte AJAX i denne sammenhæng.
Avatar billede snepnet Nybegynder
09. maj 2006 - 12:32 #1
Well.... Du kan give dem kendskab til hinanden, således at den ene har en public property af den andens type, og du kan så kalde puplic methods/properties på den - såfremt den er sat.
(det er dog ikke en anbefaling at du linker kontroller sammen på den måde... det vil vanligvis være en bedre løsning at du gør det eventbaseret, og lader din form stå for kommunikationen)
Mvh
Avatar billede gulbaek Nybegynder
09. maj 2006 - 13:03 #2
Kan man ikke benytte Page.FindControl ellers hvordan ville du lave det eventbaseret?
Avatar billede snepnet Nybegynder
09. maj 2006 - 13:07 #3
Jo - det kan du godt... men du skal så typecaste, og låser dig fast på specifikke id's - så det er ikke så fedt.
Hvordan jeg ville lave det eventbaseret. Jeg ville definere et event for den hændelse der kan udløse behovet for at gøre noget ved andre kontroller, og jeg ville så samle det op på formen, og gøre det ved den anden kontrol som der nu skal til.
Så har du pænt og nydeligt adskildte kontroller - og en programmeringsmodel der svarer til den du har for alle andre kontroller.
Mvh
Avatar billede gulbaek Nybegynder
09. maj 2006 - 13:10 #4
Kan du overtales til at lave et lille eksempel på hvordan jeg laver min egen event og fanger den :-)
Avatar billede snepnet Nybegynder
09. maj 2006 - 13:14 #5
Jada - kommer om lidt.
Mvh
Avatar billede snepnet Nybegynder
09. maj 2006 - 13:25 #6
Her en kontrol der udstiller et event:

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;

public partial class UserControls_SomeUserControls : System.Web.UI.UserControl
{
    // dit event
    public event EventHandler SomethingsCooking;

    protected void Page_Load(object sender, EventArgs e)
    {
        object o = this.Page.FindControl("GridView1");
        string s = o.ToString();
    }

    // den metode du benytter til at hæve dit event med
    protected virtual void OnSomethingsCooking(EventArgs e)
    {
        if (SomethingsCooking != null)
        {
            SomethingsCooking(this, e);
        }
    }

    // eksempel på handler af kontrolevent på formen
    // gør ikke noget ved det selv, men kalder OnSomethingsCooking således at eventet hæves.
    protected void Button1_Click(object sender, EventArgs e)
    {
        OnSomethingsCooking(e);
    }
}

Der er indsat en knap på siden - og jeg hæver eventet fra klikeventet fra denne, men det er bare et eksempel... Du kan hæve bemeldte event fra en hvilken som helst event i kontrollen, og du har også mulighed for at hæve det uanset hvilken serversidehændelse der sker fra en hvilken som helst kontrol i kontrollen ved at overskrive metoden OnBubbleEvent.... Skrive hvis det er sådan noget du har brug for.

På siden benytter du så bare kontrollen som alle andre:

<uc1:SomeUserControls ID="SomeUserControl" runat="server" OnSomethingsCooking="SomeUserControl_SomethingsCooking" />

Og du skal så lave dig en handler i din kode (på formen):
protected void SomeUserControl_SomethingsCooking(object sender, EventArgs e)
{
  Response.Write("COOKING");
  // ovenstående er bare så du kan se noget på skærmen... 
  // du kan her gøre et eller andet ved de kontroller der skal gøres noget ved
  // i forbindelse med den pågældene hændelse
}

Det er et meget simpelt eksempel - og du har self. mulighed for at specielisere dine argumenter etc. hvis den slag skulle være nødvendigt.

Mvh
Avatar billede gulbaek Nybegynder
09. maj 2006 - 13:49 #7
lige et par ekstra spørgsmål

object o = this.Page.FindControl("GridView1");
string s = o.ToString();

Har det nogen betydning?

Også er jeg støt på et problem, mine user controls blir inintializeret i min master page, og den giver følgende fejl. 

ASP.masterpage_master does not contain a definition for SomeUserControl_SomethingsCooking

nogen ide til hvordan jeg kan komme uden om det?
Avatar billede snepnet Nybegynder
09. maj 2006 - 14:20 #8
Den fortæller bare at ud ikke har en handler til metoden i din codebehind til din masterpage - altså sådan en her:
protected void SomeUserControl_SomethingsCooking(object sender, EventArgs e)
{
  //...
}

Og nej ... Det har ikke nogen betydning... Prøvede bare om jeg kunne få sidens findcontrol til at fejle i det scenarie du skrev om i dit andet spørgsmål :o)
Det kan du bare se bort fra.
Mvh
Avatar billede gulbaek Nybegynder
09. maj 2006 - 14:44 #9
Har sat sådan en tom metode ind og ved at debugge kan jeg også se at den fint fanger eventen, men eventen blir ikke fanget i min anden user control kun i master pagen :-(
Avatar billede snepnet Nybegynder
09. maj 2006 - 15:00 #10
Den bliver kun fanget af de metoder du abbonnerer på eventet med.

Hvis du f.eks. har en usercontrol
U1 med en DropDownList,

og en anden usercontrol
U2 med en liste på

og listen i U2 skal ændres i henhold til hvad der vælges i dropdownlisten i U1 - kan en løsning der ikke snørrer alle dine komponenter sammen - være som følger:

Definér event på U1

Lav en mulighed på U2 for at kunne angive datakilden udefra
(som en .DataSource property som du kender den fra de andre databundne kontroller)
Sørg for at kontrollen genrenderer sig selv når datakilden ændres, eller giv mulighed for at få kontrollen genrenderet udefra ved f.eks. en metode som Refresh/Update ell.

På din form abbonnerer du så på eventet fra U1 - og opretter en eventhandler, stadig på din form.
I den eventhandler sørger du så får at stikke UC2 de nye data, og kalder evt. en Updatemetode eksplicit (hvis kontrollen ikke selv opdaterer når datakilden ændres).

Det er self. ikke fordi det ikke kan laves på andre måder, men du skal passe på med at lave alle de der afhængigheder imellem dine kontroller.... Hvis de udelukkende kan benyttes sammen - på en specifik side - skal de jo slet ikke være selvstændige kontroller, men blot elementer på den specifikke side.

Hvis dine kontroller altid skal optræde i par under alle omstændigheder - kan du godt give f.eks. U2 kendskab til U1, og lade U2 abbonnere direkte på de events der måtte blive udbudt fra U1.

Hvis jeg skal tage stilling til hvad der kunne være en model - skal jeg vide mere om det du har lavet, og hvad det skal kunne.... Det lyder lidt som om du er ved at gøre det meget besværligt for dig selv.

Mvh
Avatar billede gulbaek Nybegynder
09. maj 2006 - 15:13 #11
Okay, prøver lige at uddybe det jeg forsøger at lave.

Har en user control Soeg det eneste den indeholder er en textbox og button

Planen er så at jeg i en anden user control skal have en metode der modtager det søge ord der blev indtastet i textboxen fra Soeg controllen og henter det data der passede udfra søge ordet og derefter viser resultatet.

Er udemærket klar over at den nemmeste måde at lave det på, var ved at benytte en querystring som der normalt blir brugt i forbindelse med søgninger. Grunden til at jeg ikke umiddelbart vil bruge den løsning er at jeg ved hjælp af AJAX vil lave det asynchron således at jeg ikke behøver opdatere hele min side bare fordi jeg foretager en simpel søgning. Om jeg så mister for meget i brugervenlighed må tiden vise.
Avatar billede snepnet Nybegynder
09. maj 2006 - 15:27 #12
Hvor mange steder (og hvilke) skal den liste der viser søgeresultatet bruges/vises?
Mvh
Avatar billede gulbaek Nybegynder
09. maj 2006 - 15:33 #13
Den skal egentlig kun bruges et enkelt sted.

Min side består af en menu til venstre som bl.a. indeholder søge feltet, på resten af siden er det så meningen at søge resultatet skal vises.
Avatar billede snepnet Nybegynder
09. maj 2006 - 15:35 #14
Skal du have den liggende på masteren... Eller skal du have en contentpage der holder resultatlisten, og hvis det sidste er tilfældet... Er det så hensigten at et klik på søg - på din master - skal resultere i at din contentpage skifter til resultatsiden... Er det sådan?
Mvh
Avatar billede snepnet Nybegynder
09. maj 2006 - 15:37 #15
("Skal du have den liggende på masteren".... den=resultatlisten)
Avatar billede snepnet Nybegynder
09. maj 2006 - 15:38 #16
Det kan godt være der lige går lidt tid inden jeg svarer igen.
Mvh
Avatar billede gulbaek Nybegynder
09. maj 2006 - 15:39 #17
Benytter mig af en contentplaceholder til at vise det, og ja det er hensigten af et klik på søg skal resultere i at min contentplaceholder viser resultatet.
Avatar billede gulbaek Nybegynder
09. maj 2006 - 15:48 #18
okay, det er en Wikipedia klon jeg er ved at programmere og hvis du kigger på følgende link bruge det give et bedre billede af hvad jeg forsøger at lave
http://da.wikipedia.org/wiki/Speciel:Search?search=eksperten

I mit tilfælde har jeg opbygget min master med følgende. En user control til Navigationen, en user control til Søgningen og en til Login systemet, alt sammen placeret til venstre. Den højre del af siden har jeg så tænkt mig at benytte en Contentplaceholder hvor jeg har tænkt mig at vise resultatet.
Avatar billede snepnet Nybegynder
09. maj 2006 - 20:27 #19
Jeg skal nok vende tilbage lidt senere :o)
Mvh
Avatar billede gulbaek Nybegynder
09. maj 2006 - 20:41 #20
hehe, så skal jeg nok sørge for at du får flere end de 30 point :-)
Avatar billede snepnet Nybegynder
10. maj 2006 - 00:45 #21
Hvis du vil undgå at benytte en querystring - og undgå at skifte mellem forms - kunne du komme relativt let omkring det ved at oprette 2 contentplaceholders på din master.

Den ene kunne du så lægge din søgeresultatsliste i - og den anden kunne du lade være en art maincontentplaceholder.

Du vil på den måde have både dit søgefelt, og den resultatliste på masteren direkte.

Alle almindelige sider kunne så angive en header i resultatlisten (eller bare overskrive den uden at lægge noget i den), og på din søgeside kunne du så undlade at overskrive resultatlisten.
Teknisk set behøver du overhovedet ikke at have en søgeformular - da søgefunktionaliteten ligger i masteren.
På den måde vil du kunne vise søgeresultater på alle de sider du vil, og du kan ved på masteren at styre visibility på dine placeholders - styre hvad der skal vises.

Et skelet kunne være sådan her:

// din master

<%@ Master Language="C#" AutoEventWireup="true" CodeFile="WikiMaster.master.cs" Inherits="WikiMaster" %>

<!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>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <table border="0" cellpadding="0" cellspacing="0" style="width: 100%; height: 100%">
            <tr>
                <td colspan="2" style="height: 200px">
                </td>
            </tr>
            <tr>
                <td style="width: 200px">
                    <asp:TextBox ID="txtSearchText" runat="server"></asp:TextBox>
                    <asp:Button ID="BtnSearch" runat="server" Text="Button" OnClick="BtnSearch_Click" /></td>
                <td>
                    <asp:contentplaceholder id="PhSearchResults" runat="server">
                        <asp:GridView ID="GridView1" runat="server">
                        </asp:GridView>
                    </asp:contentplaceholder>
                    <asp:contentplaceholder id="PhContent" runat="server">
                    </asp:contentplaceholder>
                </td>
            </tr>
        </table>
    </div>
    </form>
</body>
</html>

Søgefelt, og knap til eksekvering af søgningen.

// 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;

public partial class WikiMaster : System.Web.UI.MasterPage
{
    protected void Page_Load(object sender, EventArgs e)
    {
    }

    protected void BtnSearch_Click(object sender, EventArgs e)
    {
        this.PhContent.Visible = false;
        this.PhSearchResults.Visible = true;

        string[] searchResult = { txtSearchText.Text };

        GrdSearchResults.DataSource = searchResult;
        GrdSearchResults.DataBind();
    }
}

Det eneste der sker - er at knaptrykket samles op - en søgning eksekveres, og visibility på placeholders styres.

Dine almindelige sider kunne så se sådan her ud:
<%@ Page Language="C#" MasterPageFile="~/WikiMaster.master" AutoEventWireup="true" CodeFile="SomePage.aspx.cs" Inherits="Default2" Title="Untitled Page" %>
<asp:Content ID="Content2" ContentPlaceHolderID="PhContent" Runat="Server">
    En eller anden side<br />
    <asp:Button ID="Button1" runat="server" Text="Button" />
</asp:Content>

Bemærk at placeholderen der holder resultatlisten ikke overskrives-

Og... du kan så undvære en søgeform - hvis der ikke skal være noget i den.

Du kan jo lige prøve det af ... Det er da en mulighed der er ret enkel at have med at gøre.

Men... Jeg ville nok selv benytte querystring - det er rart at kunne linke med et søgeord direkte (også udefra).

Mvh
Avatar billede gulbaek Nybegynder
16. maj 2006 - 14:14 #22
Undskyld jeg ikke har svaret før nu, men har haft travlt de sidste par dage, men er blevet enig med mig selv om at det nok er bedst at benytte en querystring, selvom jeg finder det unødvendigt at man så er nødtil at opdatere hele ens side. Og jeg fik desværre ikke det andet til at virke.

Smid lige et svar hvis du vil have point for dit store arbejde.
Avatar billede snepnet Nybegynder
19. maj 2006 - 00:10 #23
Bare iorden - har selv været indisponibel :o)
Du får et svar her, men spørg løs hvis du gerne vil arbejde videre med den anden model.
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