terça-feira, 19 de outubro de 2010

Conversão de objetos de manipulação de XML

Com o passar dos dias a necessidade de manipular arquivos XML só vem crescendo e com isso nos deparamos com os padrões de objeto LINQ to XML ou DOM e a necessidade de conversão entre eles. Abaixo vou listar alguns tipos de conversões que podem ser úteis no dia a dia.

Converter XElement para XMLNode / Convert XElement to XMLNode
public XmlNode ConverteToXmlNode(XElement xeElement)
{
using (XmlReader xmlReader = xeElement.CreateReader())
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(xmlReader);
return xmlDoc;
}
}

Converter XDocument para XMLNode / Convert XDocument to XMLNode
public XmlNode ConverteToXmlNode(XDocument xeDocument)
{
using (XmlReader xmlReader = xeDocument.CreateReader())
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(xmlReader);
return xmlDoc;
}
}

Converter XMLDocument para XDocument / Convert XMLDocument to XDocument
XDocument xdRetornoSefaz = XDocument.Parse(varXmlDocument.OuterXml);

Converter XMLNode para XMLDocument / Convert XMLNode to XMLDocument
XmlDocument varXmlDocument = new XmlDocument();
varXmlDocument.LoadXml(varXmlNode.OuterXml);

segunda-feira, 27 de setembro de 2010

Default Button C# Asp.net

Em muitas páginas web vemos que ao pressionarmos a tecla Enter alguma coisa acontece, sempre algum evento é disparado ou a página é redirecionada para alguma outra página. Essa função é chamada de DefaultButton. Existem maneiras de se implementar essa funcionalidade.

Vejam abaixo como colocar na sua aplicação web utilizando a linguagem de programação C#. 

1) Inicie um novo website e adicione 2 botões e 1 textbox semelhante a imagem abaixo:



2) Altere os objetos para as seguintes propriedades: 

1º botão - Id: btnDefault
               Text: Default

2º botão - Id: btnNaoDefault
               Text: Não Default

1º textbox - Id: txtMensagem
                  width: 250px

3) Clique 2x em cima do botão btnDefault para disparar o evento Click() e informe o seguinte código:


    protected void btnDefault_Click(object sender, EventArgs e)
    {
        txtMensagem.Text = "Passei pelo botão Default";
    }

4) Clique 2x em cima do botão btnNaoDefault para disparar o evento Click() e informe o seguinte código:
    
    protected void btnNaoDefault_Click(object sender, EventArgs e)
    {
        txtMensagem.Text = "Não passei pelo botão Default";
    }


5) No evento Page_Load() da pagina informe a seguinte código:


    protected void Page_Load(object sender, EventArgs e)
    {
        Page.SetFocus(btnNaoDefault);
        Page.Form.DefaultButton = btnDefault.UniqueID;
    }

6) Pronto!! pressione a tecla F5 para compilar sua página. Veja que o foco é redirecionado para o botão "Não Default". Se pressionarmos a tecla Enter veja que mesmo o foco não estando no botão "Default" o metodo Click() do botão Default é disparado.

Bem é isso pessoal, vale a pena lembrar que vale também para web sites que possuem Master Page.

Até a próxima....

quarta-feira, 25 de agosto de 2010

Reflection

Do you wanna read in english?

Para quem nunca ouviu falar Reflection é um mecanismo do .Net que nos permite obter informações de assemblies em runtime(on the fly), ou seja, você consegue instanciar uma Dll em tempo de execução e extrair informações de namespaces, classes, métodos e parâmetros. Também é possível executar métodos em tempo de execução.

Precisei utilizar esse mecanismo em um novo projeto da minha empresa atual que tinha o requisito de executar métodos de uma determinada DLL em tempo de execução.

Durante minhas pesquisas verifiquei também que esse mecanismo é muito utilizado em aplicações que tem instalações de plugin.


----

To whom has never heard about, Reflection is a feature in .Net which enables us to get information about an assembly in runtime(on the fly). So in runtime you can instance a DLL and extract information about namespaces, classes, methods and parameters. You can also run a specific method in runtime.

I needed to use this feature in a new project in my actual company, which one of the requirements was to invoke some methods in runtime.

While I was researching about Reflection I could see this feature is really useful in applications which allows to install plugins.

If u need any more information, please contact me.

----


/*Código Fonte / Source Code*/

//Estou montando os parametros que o método irá receber
object[] myparam = new object[6];
myparam[0] = 90;
myparam[1] = 2;
myparam[2] = @"C:\teste\1.xml";
myparam[3] = @"C:\teste";
myparam[4] = true;
myparam[5] = true;



//Estou chamando o método que ira abrir a DLL em tempo de execução
LoadDll("c:\minhadll.dll", "Namespace.Classe", "Metodo", myparam);


///
/// Abre a dll dinamicamente
///
/// Desenvolvido por: Diego Oliveira - 05/08/2010
/// Nome da DLL
/// Nome da Classe com namespace
/// Nome do Metodo
/// Objeto de parametro
/// Retorna o objeto de retorno do metodo
public static object LoadDll(string strAssemblyName, string strClassName, string strMethodName, object[] objParametros)
{
object returnObject = null;
MethodInfo miMethod = null;
ConstructorInfo ciConstructor = null;
object objResponder = null;
Type tpType = null;
System.Type[] objectTypes;
int intCount = 0;

try
{
//Abre a dll
tpType = System.Reflection.Assembly.LoadFrom(strAssemblyName).GetType(strClassName);

//Pega os parametros passados para identificar o metodo
objectTypes = new System.Type[objParametros.GetUpperBound(0) + 1];
foreach (object objectParameter in objParametros)
{
if (objectParameter != null)
objectTypes[intCount] = objectParameter.GetType();
intCount++;
}

//Referencia o metodo
miMethod = tpType.GetMethod(strMethodName, objectTypes);
ciConstructor = tpType.GetConstructor(Type.EmptyTypes);
objResponder = ciConstructor.Invoke(null);

//Executa o metodo
returnObject = miMethod.Invoke(objResponder, objParametros);

}
catch (Exception ex)
{
throw ex;
}
finally
{
miMethod = null;
ciConstructor = null;
objResponder = null;
tpType = null;
objectTypes = null;
}

return returnObject;
}