wlasne kontrolki

0

Witam,
Mam taki problem, stworzylem sobie kontrolke zawierajaca pola tekstowe i przyciski.
W oknie głównym mam umieszczone rozne kontrolki miedzy innymi ListView i moją kontrolke opisana wyzej.
Chce teraz zeby np. po kliknieciu w mojej kontrolce danego przycisku mialo to wplyw na kontrolke ListView.
Tyle ze gdy w klasie kontrolki ktora stworzylem nie mam dostepu do innych kontrolek. Wiec pytanie brzmi:
Jak zrobic zebym klikajac w przycisk kontrolki (czyli zdarzenie OnClick, mial dostep do innych kontrolek)?

0

Stworz sobie prywatna zmienna ListView. Nastepnie do niej publiczny properties, ktory przypisuje ja i pobiera. np tak:

ListView listView;
public ListView AttachedListView
{
get { return this.listView; }
set { this.listView = value; }
}

nastepnie podczas tworzenia formy przypisz propertisowi odpowiednia wartosc.
np. this.myCustomControl.AttachedListView = this.listView1;

Wewnatrz kodu klasy bedziesz wtedy mogl operowac na powiazanym listview

0

W form1.Designer.cs

public System.Windows.Forms.ListView listView1;
private mojaKontrolka mojaKontrolka1;

W form1.cs

public Form1()
{
InitializeComponent();
this.wListView1 = this.listView1;
}
public ListView wListView1
{
get { return this.listView1; }
set { this.listView1 = value; }
}

w mojaKontrolka.cs

private void button1_Click(object sender, EventArgs e)
{
// tutaj chce np dodac jakis item do listView1... ale nadal nie mam dostepu do kontrolek, chce miec
// dostep do jakiejkolwiek funkcji w form1.cs
}

0

propertisa i zmienna ListView umieszczasz w mojaKontrolka.cs
i po inicjalizacji komponentow dajesz
this.mojaKontrolka.wLisView1 = this.listView1

pozniej w button clicku po prostu korzystasz z this.listView1

0

Jesli dobrze zrozumialem to wtedy bede miec w kontrolce mojaKonkrolka listView dokladnie taka sama jak w form1, a ja chce miec dostep do tej w form1 ... chce miec dostep do jakiejs fukcji w form1 a ona juz zalatwi reszte...

0

w mojaKontrolka.cs

class MojaKontrolka
{
    private ListView listView = null; //tu będziesz trzymać referencje do kontrolki z form1
    public ListView ListView { set { listView = value; } } //publiczny akcesor umożliwiający przypisanie tej referencji

    private void button1_Click(object sender, EventArgs e)
    {
        if(listView != null) //sprawdzasz, czy jest przypisany jakiś ListView 
        {
            listView./*...*/; //wykonujesz coś na ListView
        }
    }
//...

W form1.cs

class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        //załóżmy że twoja kontrolka nazywa się 'mojaKontrolka', a ListView na formie nazywa się 'ListView1'
        mojaKontrolka.ListView = this.ListView1; //przypisujesz twojej kontrolce referencje do ListView z formy wykorzystując publiczny akcesor, teraz w 'mojaKontrolka.listView' będzie ta sama referencja co w 'this.ListView1'
    }
//...
0

Wielkie dzieki, bardzo mi pomogles! :)

0

Ok jeszcze jedno,
sytuacja analogiczna ale chce z poziomu kontrolki wywolac funkcje znajdujaca sie w Form, jak to zrobic?

0

jeśli kontrolka leży na formie bezpośrednio to możesz wywołać jej parenta i wtedy funkcję, którą chcesz. Jeśli nie leży bezpośrednio, to kilka razy parenta, aż dojdziesz do formatki.

0

czy moglbys podac przyklad w kodzie?

0
((Button)sender).Parent.SetFocus(); ```

Zakładając, zę button leży bezpośrednio na formie. Parent to referencja do rodzica, czyli obiektu nadrzędnego. Musisz oczywiście w swojej kontrolce uzupełniać pole parent, jeśli ją tworzysz dynamicznie (chyba, wydaje mi się, że samo się nie uzupełni :P )

0

'ListView listView' przerób na 'Form1 form' (podobnie akcesor i przypisanie wewnątrz konstruktora Form1). Do ListView na formie odwołasz się przez 'form.ListView1'. Wszystkie pola klasy Form1 do których będziesz się chciał odwołać przez referencję 'form' (czyli wewnątrz twojej klasy) muszą być public lub internal.

0

Co za idiotyczne sposoby na zachowania klas! Do tego się najlepiej nadają zdarzenia, które wywołujemy w miejscu, gdzie chcemy, i łapiemy w miejscach gdzie chcemy. W ten sposób definicje kontrolek są od siebie niezależne, żadnych prywatnych pól z kontrolkami! :/

0

jeszcze raz dzieki :)

0
Deti napisał(a)

Co za idiotyczne sposoby na zachowania klas! Do tego się najlepiej nadają zdarzenia, które wywołujemy w miejscu, gdzie chcemy, i łapiemy w miejscach gdzie chcemy. W ten sposób definicje kontrolek są od siebie niezależne, żadnych prywatnych pól z kontrolkami! :/

Odnosnie wywolywania jakiegos zdarzenia to i owszem. Jednak jesli chcemy kontrolowac inna kontrolke to jak najbardziej na miejscu. Np gdy istnieje sobie na formie listview z lista imion, a powiedzmy piszemy kontrolke, ktora po wpisaniu czegos i nacisnieciu entera znajduje dany wiersz w listview i zaznacza go, zmienia kolor czy cokolwiek. Cala funkcjonalnosc mamy wtedy w jednym miejscu w kontrolce.

1 użytkowników online, w tym zalogowanych: 0, gości: 1