[C#] Přístup k ovládacím prvkům z jiné metody – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

[C#] Přístup k ovládacím prvkům z jiné metody – .NET – Fórum – Programujte.com[C#] Přístup k ovládacím prvkům z jiné metody – .NET – Fórum – Programujte.com

 

RiZe0
Newbie
20. 1. 2008   #1
-
0
-

Mám metodu ve třídě Form1 která na základě stisknutí tlačítka vytvoří vlákno druhé metody ve stejné třídě, která vykonává nějaký činný kód a podle výsledků zpracování zavolá další metodu která nastaví třeba popisky tlačítek atp. Problém je v tom, že program zkompiluji, ale spadne právě při pokusu upravit ty ovládací prvky. Zkoušel jsem k prvkům přistupovat přes Form1.JmenoPrvku.Text, nebo this.JmenoPrvku.Text, jenže přes Form1 to ani nezkompiluji (An object reference is required for the non-static field, method, or property 'CSSCon.Form1.BConnect') a přes this to spadne za běhu. Jak mám tedy přistupovat k ovládacím prvkům?

Nahlásit jako SPAM
IP: 85.207.186.–
Hula0
Návštěvník
20. 1. 2008   #2
-
0
-

Zkus u těch prvků u kterých chceš měnit vlastnosti nastavit Modifiers na true.Ale nejsem si jistý jestli je to správné řešení.

Nahlásit jako SPAM
IP: 82.202.30.–
RiZe0
Newbie
20. 1. 2008   #3
-
0
-

Modifiers jsem našel, ale teď jsem si všiml že mám všechna nastavení pro ovládací prvky zašedlá, je tam nějaký zámek nebo co? :smile19:

IDE: Visual C# 2008

EDIT: hmm, asi jsem si otevřel nějaký špatný soubor nebo co :-)

Nahlásit jako SPAM
IP: 85.207.186.–
Hula0
Návštěvník
20. 1. 2008   #4
-
0
-

Hele ja ti to napsal špatně Modifiers musíš nastavit na Interal nebo Public, žadný true...Sorry a taky to musíš nastavit u káždýho prvku zvlášť..

Nahlásit jako SPAM
IP: 82.202.30.–
RiZe0
Newbie
20. 1. 2008   #5
-
0
-

Tak já radši dám kousky zdrojáků. Tlačítka kterých se to týká mají Modifiers nastavený na Public a stejně když je zkouším upravit tak to padá. Jinak, BConnect je tlačítko, TAdress je textové pole pro IP adresu, TStatus je popisek ve stavové liště, program padne na řádku (zde) 15



private void ChangeState(uint Type, String Args)
{
// Status čekání na akci
//
if (Type == S_READY)
{
this.BConnect.Text = "Připojit";
this.BConnect.Enabled = true;
}
// Status přpojování
//
else if (Type == S_CONNECTING)
{
this.BConnect.Text = "Připojuji";
this.BConnect.Enabled = false;
this.TStatus.Text = Args;
}
// Status připojen
//
else if (Type == S_CONNECTED)
{
this.BConnect.Text = "Obnovit";
this.BConnect.Enabled = true;
this.TStatus.Text = "Odezva: " + Args;
}
// Status chyba
//
else
{
this.BConnect.Text = "Připojit";
this.BConnect.Enabled = true;
this.TStatus.Text = Args;
}
}

private void BConnect_Click(object sender, EventArgs e)
{
Thread tPing = new Thread(Ping);

tPing.IsBackground = true;
tPing.Start(TAdress.Text);

// TODO: Ukončení a opětovný start vlákna
//
}

private void Ping(object IAdress)
{
// Převod objektu na string
String Adress = (string)IAdress;


// Pokračování za předpokladu vyplněné adresy
//
if (Adress != "")
{
while (true)
{
this.ChangeState(S_CONNECTING, "Připojuji se k serveru");

String[] CIpHost = Adress.Split(':');
String CIp = CIpHost[0];
Int16 CPort = Convert.ToInt16(CIpHost[1]);

Ping pingSender = new Ping();
PingOptions options = new PingOptions();

// Use the default Ttl value which is 128,
// but change the fragmentation behavior.
options.DontFragment = true;

// Create a buffer of 32 bytes of data to be transmitted.
string data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
byte[] buffer = Encoding.ASCII.GetBytes(data);
int timeout = 500;
PingReply reply = pingSender.Send(CIp, timeout, buffer, options);

if (reply.Status == IPStatus.Success)
{
//MessageBox.Show(Convert.ToString(reply.RoundtripTime));
this.ChangeState(S_CONNECTED, Convert.ToString(reply.RoundtripTime) + "ms");
}
else
{
this.ChangeState(S_CONNECTED, "Timeout");
}

Thread.Sleep(500);
}
}
// Není vyplněna IP adresa
//
else
{
this.ChangeState(S_ERROR, "Vyplňte prosím IP adresu");
}
}

Nahlásit jako SPAM
IP: 85.207.186.–
Hula0
Návštěvník
20. 1. 2008   #6
-
0
-



Form1 mujForm= new Form1();
MujForm.BConnect.Text = "Připojuji";
MujForm.BConnect.Enabled = false;
MujForm.TStatus.Text = Args;


Zkus použít i Interal

Nahlásit jako SPAM
IP: 82.202.30.–
RiZe0
Newbie
20. 1. 2008   #7
-
0
-

I toto jsem zkoušel, ale nakonec mi bylo řečeno, ať využiji následující metodu, která dovolí text u tláčítka změnit. U ostatních prvků, zrovna v mém případě text ve stavovém řádku, skutečně stačilo this.TStatus.Text = Args, u tlačítka jsem musel použít ChangeText(this.Tlacitko, "Text"); a teď ten kód.



public void ChangeText(Control ctrl, String value)
{
if (ctrl.InvokeRequired)
ctrl.Invoke((MethodInvoker)delegate() { ctrl.Text = value; });
else
ctrl.Text = value;
}

Nahlásit jako SPAM
IP: 85.207.186.–
Hula0
Návštěvník
20. 1. 2008   #8
-
0
-

Aha, tak to sem ti radil uplně něco jínýho.To se ti hodí když potřebuješ k těm vlastnostem přistupovat z jínýho formuláře.

Nahlásit jako SPAM
IP: 82.202.30.–
RiZe0
Newbie
20. 1. 2008   #9
-
0
-

Alespoň to budu vědět dopředu, díky :smile1:

Nahlásit jako SPAM
IP: 85.207.186.–
trp
~ Anonymní uživatel
5 příspěvků
21. 1. 2008   #10
-
0
-

Taky by misto vlakna se stejnym efektem a bez problemu s pristupem k GUI prvkum mel jit pouzit BackgroundWorker..

Nahlásit jako SPAM
IP: 194.213.32.–
paashi0
Super člen
25. 1. 2008   #11
-
0
-

Já jsem měl možná podobný problém při práci se sériovým portem - událost při přijetí dat na portu vytvoří nové vlákno a nešlo mi vypsat do textboxu "data přijata". Při pokusu o změnu textu za běhu programu mi vypsalo něco o nepovoleném přístupu k prvku z vlákna, ve kterém nebyl vytvořen. Tak jsem hledal a našel jsem si:



delegate void SetTextCallback(Control ctrl, String text);

private void SetText(Control ctrl, String text)
{
// InvokeRequired required compares the thread ID of the
// calling thread to the thread ID of the creating thread.
// If these threads are different, it returns true.
if (ctrl.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke(d, new object[] { ctrl, text });
}
else
{
ctrl.Text = text;
}
}

V programu potom metodu volám následovně:


SetText(textBox1, "Ahoj světe");

Nevím, jestli ti to pomůže, protože jsem nestudoval tvůj kód do podrobností, ale mě to pomohlo. Dá se to upravit i pro nastavení jiných vlastností jiných prvků, podmínkou je přítomnost vlastnosti InvokeRequired.

Nahlásit jako SPAM
IP: 158.193.216.–
Ajem tíčr, andrgraund tíčr!
F_Lupus0
Newbie
26. 1. 2008   #12
-
0
-

To trp : podle mě je s BackgroundWorkerem stejný problém nejde konec konců o nic jiného než taky o vlákno... nedovolí modifikovat ovládací prvky, které nebyly vytvořeny v jeho kontextu... řešení je stejné...

Nahlásit jako SPAM
IP: 85.160.2.–
-SnakyWolf-
trp
~ Anonymní uživatel
5 příspěvků
26. 1. 2008   #13
-
0
-

To F_Lupus : to se pletes v eventu ProgressChanged ktery vyvolas nekdy v prubehu toho pracovniho vlakna BackgroundWorkeru menit vlastnosti prvku na formulari jde..

Nahlásit jako SPAM
IP: 194.213.32.–
F_Lupus0
Newbie
26. 1. 2008   #14
-
0
-

To trp : mas pravdu...nejak me nenapadlo tuhle eventu pouzit.... diky za rozsireni znalosti :)

Nahlásit jako SPAM
IP: 85.160.30.–
-SnakyWolf-
mrsami
~ Anonymní uživatel
1 příspěvek
20. 2. 2008   #15
-
0
-

Pro nejjednodussi pochopeni je dobrej tenhle priklad, je to ten nejjednodussi bezpecnej zpusob:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
private const int s = 12;

Thread mujThread = null;
delegate void mujDelegat(string text);//delegat pro pristup k textboxu
delegate void mujDelegatListBox(string[] text);//pro pristup k listboxu

public void startFce()//jenom spousteci fce, musi byt bezparametricka, nesmi byt static
{
this.vykonnaFce("Nastaveno");//musi byt volana dalsi fce, aby mohl byt predan
//spousteci parametr

}


public Form1()
{
InitializeComponent();
}

private void vykonnaFce(string text)//tato fce uz opravdu neco dela
{
if (this.textBox1.InvokeRequired)//pokud je volano z jineho threadu
//zabezpeci bezpecny pristup ke komponente,
//dale bude vykonan blok else
{
mujDelegat d = new mujDelegat(vykonnaFce);//vlakno si vytvori vlastniho delegata
this.Invoke(d, new object[] { text });
}

else//sem se pise kod, CO SE MA UDELAT !!!!!!!
{
this.textBox1.Text = text;
}
}


private void startFceListBox()//pocatecni fce pro listbox
{
string[] pole = new string[] {"1","2"};
this.vykonnaFceListBox(pole);
}

private void vykonnaFceListBox(string [] text)//vykonna fce pro listbox
{
if (this.pridejListBoxButton.InvokeRequired)//zabezpeci bezpecny pristup k listboxu
{
string[] pole = text ;
mujDelegatListBox d = new mujDelegatListBox(this.vykonnaFceListBox);
this.Invoke(d, new object[] { pole });
}
else//sem opet kod, co se ma vykonat
{
foreach (string i in text)
this.listBox1.Items.Add(i);
}

}

private void nastavTextBoxButton_Click(object sender, EventArgs e)
{
this.mujThread = new Thread(new ThreadStart(this.startFce));
this.mujThread.Start();

}

private void pridejListBoxButton_Click(object sender, EventArgs e)
{
this.mujThread = new Thread(new ThreadStart(startFceListBox));
this.mujThread.Start();
}


}
}

Nahlásit jako SPAM
IP: 160.216.156.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 9 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý