Jump to content

[c#] "Construir o nome do evento" [RESOLVIDO]


RVG

Recommended Posts

Boax....

Precisava de ajuda num problema, que me tem dado que fazer  :wallbash:

exemplo:

2 Buttons -- button1 e button2

1 TextBox - textbox1

void TextBox1Leave(object sender, System.EventArgs e)
{
    if(textBox1.Text=="1")
    {
	button1.PerformClick();
    }
    if(textBox1.Text=="2")
   {
   	button2.PerformClick();
   }

}

até aqui funciona  🙂

agora se quiser fazer:

void TextBox1Leave(object sender, System.EventArgs e)
{
button+"textbox1.text" .PerformClick();
}

nao vai dar....

Se me pudessem dar umas luzes daquilo que procuro...

obg.

Link to comment
Share on other sites

hmm...

A única linguagem que conheço onde podias fazer algo do género é em PHP, em C# não me parece... Mas posso estar enganado.

A primeira forma é a mais correcta de qualquer das maneiras. Posso saber porque estás a tentar fazer dessa forma?

"Nunca discutas com um idiota. Eles arrastam-te até ao seu nível e depois ganham-te em experiência"

Link to comment
Share on other sites

boax...

Isto é so um teste....

Porque na realidade, tenho varias texbox, que ao perderem o focus, mediante certas condicoes, realizem certos eventos...

recupero o nome da textbox, mediente o sender, e depois, com tratamentos, acho o nome do botao que quero. ate aqui nao ha problemas.

ou seja, fico numa variavel texto com o nome do botao.

do estilo:

string nome="b_sala";

o que eu queria era      nome.PerformClick();

claro que isto nao da...

ja tentei fazer atraves de "cast" atraves de "Convert.ChangeType" ... mas sem resultados...

é que eu tenho este tratamento aparentemente simples, mas que é necessario fazer um sem numero de vezes...

Link to comment
Share on other sites

void TextBox1Leave(object sender, System.EventArgs e)
{
   String butaoNome = "button" + textbox1.text;

   if(this.Controls.ContainsKey(butaoNome))
       (this.Controls[butaoNome] as Button).PerformClick();
}

Convém verificar se no cast não ficas com null, mas presumindo que será sempre um butão (se tu garantes isso) como está deverá funcionar.

"Give a man a fish and he will eat for a day; Teach a man to fish and he will eat for a lifetime. The moral? READ THE MANUAL !"

Sign on a computer system consultant's desk

Link to comment
Share on other sites

boax.. ...

tou de volta com mais problmeas  ?

Coloco aqui a pergunta, por estar no seguimento deste topico...

jsalas - form que "herita" doutra, e onde se passam parametros ... 😞

jsalas jns= new jsalas(Par_1,Par_2,Par_3);
jns.ShowDialog();

funciona...

agora, se quiser que o nome da  form de jsalas tambem seja dinamico:  "j"+textbox1.text;

Se puderes voltar a dar-me luzes  ? 

depois de andar pela net, e depois do teu codigo anterior, cheguei a :

string NomeForm="Form1";
Form frm = (Form)Activator.CreateInstance(Type.GetType(NomeForm),true)";
frm.ShowDialog();

so que isto, compila, mas na execucao diz-me o o type é null ...  :wallbash:

Link to comment
Share on other sites

Não percebi o que queres.

Queres criar um jsalas e mudar  a propriedade "Name" dele para um valor definido numa textbox?

Se for isso é simples.

String nomeForm = "Form1";
Jsalas jns = new Jsalas(par1, par2, par3);
jns.Name = nomeForm;

É isto que queres?

Se não é, então explica melhor porque não percebi o que querias fazer.

Em relação ao GetType é claro que dá null. Se calhar queres é fazer GetType("Windows.Forms.Form") ?

Mas isso não tem lógica, só usas isto quando não sabes com que tipo estás a trabalhar, por exemplo em programação genérica. Neste caso sabes que é um Form, logo podes fazer um "new Form" directamente.

"Give a man a fish and he will eat for a day; Teach a man to fish and he will eat for a lifetime. The moral? READ THE MANUAL !"

Sign on a computer system consultant's desk

Link to comment
Share on other sites

boax...

e obrigado pela tua ajuda  😛

relendo o meu post anterior, vejo que nao é muito claro...

misturei duas coisas  ?

quando falo em jsalas ... isso é no programa

quando falo em Form1 , é no teste...

o que se passa é o seguinte.... tenho varias forms, e em cada uma delas tenho varios butoes....  nos eventos onclick de cada butao, tenho exacatemente o mesmo codigo para todos, a unica diferenca é na form que vai chamar :

butao1 - nome :    b_salas        onclick, vai abrir a form j_salas.

butao2 - nome:    b_edificios  onclick, vai abrir a form j_edificios.

ou seja, tenho varios eventos onclik, com o codigo quase igual, onde a unica diferenca é a form que vai abrir.

queria eliminar isso tudo, e num so evento, tratar de tudo.

para isso precisava de "compor" o nome da form a chamar, algo parecido com os posts iniciais....

em vez de ter    j_salas jns= new j_salas(X,Y,X);

conseguir, que neste caso, "salas" seja dinamico, para poder substituir por "edificios" ou por outra palavra que seja necessario....

mas desde ja, obrigado pelo teu interresse..

Link to comment
Share on other sites

Ahh oky, já percebi. Sim isso é possivel e bastante simples até.

Existem várias maneiras de fazer isso. Aqui vai uma delas, secalhar a menos complexa.

Primeiro metes o evento do click dos butões para a mesma função. Esse é a intenção certo?

Segundo. No objecto Button (e em qualquer Control) existe uma propriedade "Tag". Essa propriedade serve mesmo para associar qualquer tipo de informação a um control. No nosso caso vais associar ao Form que queres abrir, que será o nome dele. Ou seja, no botão que irá abrir as j_salas, a propriedade Tag irá ter a string "j_salas". Este valor tem que ser exactamente o nome da Class que queres criar.

Depois o código da função será

private button_click(object sender, EventArgs e) {
   Button b = sender as Button;
   
   //Verifica se o evento foi despoletado por um butao
   if(b != null) {
      String novoForm = b.Tag.ToString();
      
      // Verifica se o botão tem definido o Form a criar
      if(!String.IsNullOrEmpty(novoForm)) {
         Type t = Type.GetType(novoForm);
         Form f = Activator.CreateInstance(t);
         // Ou então com parametros, mas não sei o que eles significam o tal X, Y, Z
         // Form f = Activator.CreateInstance(t, new object[] {X, Y, Z}) as Form;
         f.Show();
      }
   }
}

"Give a man a fish and he will eat for a day; Teach a man to fish and he will eat for a lifetime. The moral? READ THE MANUAL !"

Sign on a computer system consultant's desk

Link to comment
Share on other sites

boax....

esta-me a escapar algo...  ?

num exemplo simples:

2 forms    MainForm e Form1

Na MainForm so temos um butao com a tag  a "Form1"

no evento onclick

 
if(b != null) {
  String novoForm = b.Tag.ToString();  // Com um messageBox, confirmei que vem bem carregado
    // Verifica se o botão tem definido o Form a criar
    if(!String.IsNullOrEmpty(novoForm)) {
    Type t = Type.GetType(novoForm);   //Tambem experimentei por  	Type t = Type.GetType("Form1");   Mas continua null
    MessageBox.Show(Convert.ToString(t));    // ESTA VAZIO, Logo na execucao vai me dar erro por nao poder ser nulo  
    Form f = (Form)Activator.CreateInstance(t);  //tive de acrescentar (Form) senao nao compilava...
    f.Show();

Obg pela atencao..

Link to comment
Share on other sites

É porque não estás a referir a class em condições.

Para teres a certeza que estás a usar a string correcta faz o seguinte.

Para saber a String do nome do Form1. No evento Load mete o seguinte código.

private void Form1_Load(object sender, EventArgs e) {
   MessageBox.Show(this.GetType().Fullname);
}

O texto que aparecer é o texto que tens de ter na Tag do botão. É por esse nome que a Class é conhecida na Assembly.

O usual é ser "Namespace"."ClassName"

"Give a man a fish and he will eat for a day; Teach a man to fish and he will eat for a lifetime. The moral? READ THE MANUAL !"

Sign on a computer system consultant's desk

Link to comment
Share on other sites

boax ...

depois de referir correctamente a class e fazendo o teu:

Form f = Activator.CreateInstance(t, new object[] {X, Y, Z}) as Form;

funciona as mil maravilhas....  👍   😛

Eu so tenho uma coisa a dizer .....

MUITO; MUITO OBRIGADO .....

Não tenho palavras para te agredecer ...

😛   👍

PS: ja agora, se mais alguem seguiu este tema, as propriedades de jt, deixam de estar acessiveis.... a solucao que achei, gracas a Betovsky foi utilizar os "controls"  no meu caso ficou:    jt.Controls["panel1"].Controls["l_id_retorno"].Text    , para saber o texto de l_id_retorno  .

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.