• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

RVG

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

14 mensagens neste tópico

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

boax...

obrigados a todos pelas respostas...

Betovsky, a tua solucao funciona no exemplo ...  :) :) :):P

na aplicacao em si, experimento amanha :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

boax...

e obrigado pela tua ajuda  :P

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..

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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();
      }
   }
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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..

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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"

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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....  :thumbsup:  :P

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

MUITO; MUITO OBRIGADO .....

Não tenho palavras para te agredecer ...

:P  :thumbsup:

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  .

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora