webForumDet fria alternativet

FindControl i Windows.Form

.NETur .NET

4 svar · 279 visningar · startad av aleborg

Medlem sedan jan. 20013 341 inlägg
Frågan#1

Jag har en Windows Form med en tabcontrol. i tabcontrolen har jag ett antal textboxar och dropdownlist uppdelade på rader och döpta efter raden.
t ex rad ett: txtArt1, txtText1, txtPris1
txtArt1 är dropdownlist dom andra textboxar.

Jag har en funktion som ser ut så här:

	private Control FindControl(string Target, Control.ControlCollection cont)
	{
		Control myControl = new Control ();
		foreach (Control c in cont)
		{
			if (c.Name == Target)
			{
				myControl = c;                         
			}
			else
			{
				if(c.Controls.Count >0)
					myControl = FindControl(Target,c.Controls);
			}
		}
		return myControl;
	}

Alla dropdownlistor är kopplade till
private void txtArt1_SelectedIndexChanged(object sender, System.EventArgs e)
Som ser ut så här:

		private void txtArt1_SelectedIndexChanged(object sender, System.EventArgs e)
		{
			ComboBox dd = ((ComboBox)sender);
			string cn = dd.Name.Replace("txtArt","");
			
			FakturaDLL.Products pr = new FakturaDLL.Products();
			if(pr.GetProduct(dd.Text))
			{
				((TextBox)this.FindControl("txtText"+cn, this.Controls)).Text = pr.ProdText.ToString();
				((TextBox)this.FindControl("txtPris"+cn, this.Controls)).Text = pr.ProdPrice.ToString();
			}
			else
				MessageBox.Show("Produkten kunde inte hittas!");
		}

Den här koden funkar OM textboxarna ligger utanför tabcontrolern men inte när dom ligger i.
Då får jag: Den angivna omvandlingen är inte giltig.
på den här raden:
((TextBox)this.FindControl("txtText"+cn, this.Controls)).Text = pr.ProdText.ToString();

Den går igenom FindControl men verkar returnera nått felaktigt, namnet är iaf tomt på den kontrollern som hittas.
Vad 17 är fel?

Medlem sedan maj 20021 466 inlägg
#2

Du bör nog undvika att använda Name-egenskapen. Det är ingen egenskap som man ska använda. Försök att identifiera dina kontroller på annat sätt. T.ex. genom att lägga dem i en lista eller genom Tag-egenskapen.

Medlem sedan jan. 20013 341 inlägg
#3

Av vilken orsak? Name egenskapen har fungerat felfritt för mig och det är inte där felet ligger. Jag verkar få rätt controll tillbaka från FindControl har jag sett nu men det här blir fel:
((TextBox)this.FindControl("txtPris"+cn, this.Controls)).Text = pr.ProdPrice.ToString();

Medlem sedan jan. 20013 341 inlägg
#4

Glöm det. löste det

		private Control FindControl(string Target,Control Parent)
		{

			Control myControl = new Control ();
			foreach (Control c in Parent.Controls)
			{
				if (c.Name == Target)
				{
					return c;
				}
				else
				{
					if(c.Controls.Count >0)
						myControl = FindControl(Target,c);
				}
			}
			return myControl;    
		}
Medlem sedan maj 20021 466 inlägg
#5

Orsaken är att Name-egenskapen är en sträng som KAN vara samma som kontrollens namn. Den behöver dock inte vara det. Om du t.ex. kopierar en kontroll uppdateras inte egenskapen. Källa. Det är en opålitlig egenskap som man bör undvika. Den finns endast för att VB6-program ska fungera. Fast vill du skriva dåliga program är det upp till dig.

Du kan förresten ta bort "myControl = new Control ()" eftersom du aldrig använder den kontroll som du skapar där.

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