Arquivo da categoria ‘C#’

Você pode se conectar ao IBM DB2 usando conexões baseadas no componente de dados da Microsoft chamado MDAC, no qual suporta os tipos de conexões Microsoft como ADO NET, OLE DB, ODBC, mas se você deseja uma alta performance, maior segurança e acesso a todos os recursos do IBM DB2 você pode usar o IBM Data Server Provider for .Net.

MDAC

Microsoft Data Access Components é uma estrutura de tecnologias da Microsoft inter-relacionada que permite aos programadores uma forma abrangente de desenvolvimento de aplicativos que podem acessar praticamente qualquer armazenamento de dados e uniforme. Seus componentes incluem: ActiveX Data Objects (ADO), OLE DB, e Open Database Connectivity (ODBC). Houve vários componentes obsoletos, assim, como o Microsoft Jet Database Engine, MSDASQL (o fornecedor de OLE DB para ODBC) e Remote Data Services (RDS). Alguns componentes também se tornaram obsoletos, como o Data Access Objects API e Remote Data Objects.

IBM Data Server Provider for .NET

O Provedor IBM ® Data Server para. NET estende o suporte de servidor de banco de dados para a interface ADO.NET. O provedor oferece acesso de alto desempenho e seguro para servidores de dados IBMO IBM Data Server Provider para. NET é um nome que é usado para descrever os provedores .NET que são distribuídos com o servidor de dados clientes dos produtos IBM.

IBM DB2 - Express-C

IBM DB2 – Express-C

Local: C:\Program Files\IBM\SQLLIB\BIN\netf40

Assembler: IBM.Data.DB2.dll

Conectando ao IBM DB2 usando o IBM.Data.DB2.dll

1 – Crie um novo projeto C# e Design Time disponha na tela 5 componentes Labels, 4 Textboxs e um Button e configure o layout com na figura abaixo:

Layout e Referencia

Layout e Referencia

2 – Na janela Solution Explorer com o botão direito no projeto clique em Add > Reference, na janela seguinte sobre o menu Browse , clique no botão Browse e navegue até o driver de conexão da IBM citado logo acima, selecione o arquivo IBM.Data.DB2.dll e clique em OK:

Driver DB2 .NET

Driver DB2 .NET

3 – Use os trechos do código abaixo para completar o seu código gerado automaticamente.

Exemplo:

Neste exemplo utilizamos os Namespaces IBM para conectar ao banco de dados usando IBM Data Server Provider for .Net.

C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using IBM.Data.DB2; // namespace IBM

namespace ConexaoDb2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public static void getDBConnection(string Server, string Database,
                                    string Username, string Password, string Timeout)
        {
            try
            {
                // String de Conexao
                string connectionString =

                    // Servidor
                    "Server=" + Server +

                    // Banco de dados
                    ";Database=" + Database +

                    // Usuario
                    ";UID=" + Username +

                    // Senha
                    ";PWD=" + Password +

                    // TNSnames
                    ";Connect Timeout=" + Timeout;

                //Conecta ao datasource usando a conexão DB2
                DB2Connection conn = new DB2Connection(connectionString);

                //Abre a conexão com o banco de dados
                conn.Open();
                MessageBox.Show("Conexão efetuada com sucesso");

            }
            // Retorna erro
            catch (Exception ex)
            {
                // Mostra menssagem de erro
                MessageBox.Show(ex.ToString());

            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // Cria conexão
            getDBConnection(textBox1.Text, textBox2.Text, textBox3.Text, textBox4.Text, "30");
        }
    }
}

Além do software básico de conectividade do cliente Oracle, uma conexão Oracle com acesso aos recursos completos ao banco de dados requer o uso do que é conhecido como um provedor de dados gerenciado onde “gerenciado” refere-se ao código gerenciado pelo .NET. O provedor de dados é a camada entre o código. NET e o software de conectividade de cliente  do Oracle.  O Provedor de Dados Oracle para .NET (ODP.NET) é um ADO NET Oracle 2.0 de alto desempenho que expõe um conjunto completo de características específicas da Oracle e opções de ajuste, incluindo suporte para Real Application Clusters, DB XML e segurança avançada.

Conexão Oracle ODAC

Conexão Oracle ODAC

Obs: Caso não tenha instalado o ODAC 12c em seu computador você encontra um walkthrough de com instalar e configurar tanto o cliente ou o servidor Oracle, em nossa categoria SQL.

Conectando ao Oracle usando ODAC do Visual Studio

1 – Crie um novo projeto C# e Design Time disponha na tela 4 componentes Labels, 3 Textboxs e um Button e configure o layout com na figura abaixo:

Layout e Referencia

Layout e Referencia

2 – Na janela Solution Explorer com o botão direito no projeto clique em Add > Reference, na janela seguinte sobre o menu Assemblies > Extensions escolha a opção  Oracle.DataAccess versão 4.112.2.0 e clique em OK:

Oracle Data Access

Oracle Data Access

3 – Use os trechos do código abaixo para completar o seu código gerado automaticamente.

Exemplo:

Neste exemplo utilizamos os Namespaces Oracle para conectar ao banco de dados usando Oracle Client, é possível distribuir sua aplicação sem que precise da instalação do cliente da Oracle distribuindo certos arquivos dll junto com sua aplicação.

C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Oracle.DataAccess.Client; // namespace Oracle

namespace ConexaoOracle
{
    public partial class Form1 : Form
    {       

        public Form1()
        {
            InitializeComponent();
        }

        // Cria conexão com o banco de dados Oracle
         static public void getDBConnection(string Username, string Password, string Datasource)
		{
			try
			{
				// String de Conexao
				string connectionString = 

					// Usuario
					"User Id=" + Username +

					// Senha
					";Password=" + Password +

					// TNSnames
					";Data Source=" + Datasource;

				//Conecta ao datasource usando a conexão Oracle
                OracleConnection conn = new OracleConnection(connectionString);

				//Abre a conexão com o banco de dados
				conn.Open();
                MessageBox.Show("Conexão efetuada com sucesso");

			}
			// Retorna erro
			catch (Exception ex)
			{
				// Mostra menssagem de erro
				MessageBox.Show(ex.ToString());

			}
		}

        private void button1_Click(object sender, EventArgs e)
        {
            // Cria conexão
            getDBConnection(textBox1.Text, textBox2.Text, textBox3.Text);

        }       

    }
}

Em interface gráfica do usuário (GUI), uma interface de documentos múltiplos, ou MDI, acrônimo para Multiple Document Interface é um método de organização de aplicações gráficas em janelas que residem em uma única janela, a janela principal da aplicação. A única exceção são possíveis janelas modais da aplicação.

Com múltiplas interfaces de documentos, uma única barra de menu e / ou barra de ferramentas é compartilhado entre todas as janelas filho, reduzindo a desordem e uma utilização mais eficiente do espaço na tela. As janelas filho de um aplicativo pode ser ocultada / mostrada / minimizada / maximizada como um todo. Os autores de aplicações multi-plataforma podem fornecer a seus usuários um comportamento consistente da aplicação entre plataformas.

Interface de Múltiplos Documentos

Interface de Múltiplos Documentos

MdiClient

Representa o recipiente para uma interface de documentos múltiplos (MDI) formulários filho. Você definir se um formulário será um container para múltiplos documentos através da propriedade Form.IsMdiContainer.

Form Child

Você pode definir um formulário como filho o atribuindo a um formulário pai através da propriedade MdiParent, que 0btém ou define uma interface de documentos múltiplos.

Exemplo:

Neste exemplo criamos um formulário MDI básico e um menu. Ressaltando que usamos o Design Time do Visual Studio somente para criar os formulários por opção, o código é inserido parte no construtor da classe do formulário e parte no evento OnShown do Form. Você pode criar tudo dinamicamente ou tudo em Design Time. Vale brincar com o construtor e os eventos dos formulários, porque apesar de alguns eventos possuírem funcionalidades parecidas, não são iguais e existem diferenças peculiares entre eles.

Para criar o segundo formulário, clique com o botão direito em cima do seu projeto na janela Solution Explorer e clique em Add e em Windows Form.

C#

Formulario – Pai

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

namespace formularioMdi
{
    public partial class Form1 : Form
    {
        // Declara componentes
        MenuStrip menu;

        public Form1()
        {
            // Inicializa formulario       
            
            // Define formulario como pai.
            this.IsMdiContainer = true;
                        
            // Cria painel para formularios filhos
            ToolStripPanel painel = new ToolStripPanel();

            // Define tamanho do painel
            painel.Dock = DockStyle.Fill;

            // Cria barra do menu
            menu = new MenuStrip();

            // Cria menu
            ToolStripMenuItem itens1 = new ToolStripMenuItem("Formularios");

            // Cria itens do menu
            ToolStripMenuItem m1item1 = new ToolStripMenuItem("Novo", null, new EventHandler(clique1_m1));
            ToolStripMenuItem m1item2 = new ToolStripMenuItem("Sair", null, new EventHandler(clique2_m1));

            // Adiciona itens ao menu e menu a barra de menu
            itens1.DropDownItems.Add(m1item1);
            itens1.DropDownItems.Add(m1item2);
            menu.Items.Add(itens1);            

            InitializeComponent();
        }

        private void Form1_Shown(object sender, EventArgs e)
        {
            // Define texto 
            this.Text = "Desenvolvimento Aberto - Formulario - Main Form / Child Form";

            // Define tamanho e posição do formulario principal            
            this.Top = 0;
            this.Left = 0;
            this.Width = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width - 50;
            this.Height = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height - 50;
           
            // Adiciona menu ao formulario
            this.Controls.Add(menu);

        }

        private void clique1_m1(object sender, EventArgs e)
        {
            // Chama instancia do formulario filho
            FormularioFilho formularioFilho = new FormularioFilho();
            formularioFilho.MdiParent = this;
            
            // Usa metodo estatico para exibir numero da instancia
            formularioFilho.Text = "Formulario Filho - Instancia:" + this.MdiChildren.Length.ToString();

            // Chama formulario
            formularioFilho.Show();
        }

        private void clique2_m1(object sender, EventArgs e)
        {
            // Fecha formulario
            this.Close();
        }

    }
}

Formulario – Filho

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

namespace formularioMdi
{
    public partial class FormularioFilho : Form
    {
        // Declara componentes
        Label rotulo;
        TextBox campo;
        Button botao;

        public FormularioFilho()
        {
            InitializeComponent();
        }

        private void FormularioChild_Shown(object sender, EventArgs e)
        {
            // Define tamanho do formulario
            this.Size = new Size(360, 150);

            // Cria componentes
            rotulo = new Label();
            campo = new TextBox();
            botao = new Button();

            // Defie tamanho
            rotulo.Size = new Size(200, 20);
            campo.Size = new Size(300, 20);

            // Define posição
            rotulo.Location = new Point(12, 20);
            campo.Location = new Point(12, 40);
            botao.Location = new Point(12, 70);

            // Define texto
            rotulo.Text = "Digite seu nome:";
            botao.Text = "Ok";

            // Adiciona componentes ao fomrulario
            this.Controls.Add(rotulo);
            this.Controls.Add(campo);
            this.Controls.Add(botao);

        }
    }
}

 

 

Visual – ToolTip – C#

Publicado: 29 de abril de 2014 em C#

Tooltip é um elemento comum de interface gráfica GUI, também conhecida como dica de contexto é aquela moldura pop up que abre quando você passa o mouse sobre um elemento da interface (normalmente uma palavra em um texto) e que contém uma explicação adicional sobre aquele elemento que recebeu o ponteiro do mouse sobre ele. É utilizado em conjunto com um cursor, normalmente um ponteiro do mouse. O usuário paira o cursor sobre um item, sem clicar nele, e uma pequena “caixa” irá aparece com informações complementares relativas a este item.

ToolTip

ToolTip

ToolTip

Representa uma pequena janela pop-up retangular que exibe uma breve descrição do propósito de um controle quando o usuário posicionar o ponteiro do mouse sobre o controle.

Exemplo:

Neste exemplo usamos o objeto ToolTip para exibir uma dica para o usuário ao pairar o cursor do mouse sobre o botão.

C#

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

namespace Dicas
{
    public partial class Form1 : Form
    {
        // Declara componentes
        Label rotulo;
        Button botao;
        ToolTip dicas;
                
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Shown(object sender, EventArgs e)
        {
            // Define propriedades do formulario
            this.Text = "DA - ToolTip";
            this.Size = new Size(300, 150);

            // Cria componentes
            rotulo = new Label();
            botao = new Button();
            dicas = new ToolTip();

            // Define tamanho e localização
            rotulo.Size = new Size(300, 20);
            rotulo.Location = new Point(0, 20);
            botao.Location = new Point(10, 50);

            // Define textos
            rotulo.Text = "Pare o cursor em cima do botão por alguns segundos";
            botao.Text = "Aperte Aqui!";

            // Alinha texto
            rotulo.TextAlign = ContentAlignment.TopCenter;

            // Define propriedades de tempo para o componente de dicas
            dicas.AutomaticDelay = 2000;
            dicas.AutoPopDelay = 3000;
            dicas.ReshowDelay = 500;
            dicas.ShowAlways = true;

            // Define dica para o componente escolhido
            dicas.SetToolTip(botao, "Desenvolvimento Aberto - " +
                                    "Clique neste botão para executar uma ação.");

            // Adiciona componentes ao formulario
            this.Controls.Add(rotulo);
            this.Controls.Add(botao);

        }
       
    }
}

O que a linguagem de programação Delphi tem em comum com Java e C#? A resposta é tudo? Ou nada? Quem sabe!. Estranho? Com certeza! E a resposta correta depende da versão do Delphi do qual estamos nos referindo. Ou não?

O Delphi nasceu em 1995 como uma linguagem de programação Object Pascal para o Windows 16 bits e foi o primeiro a ser descrito como ambiente RAD (em português, Desenvolvimento Rápido de Aplicações), seu nome faz alusão ao banco de dados Oracle, pois na mitologia grega o Oraculo (Oracle) podia ser encontrado no templo de Delphi.

Delphi - Win32

Delphi – Win32

O Delphi se difundiu pelo mundo na sua versão para Windows 32 bits,  justamente por fazer realmente o que prometia, era rápido para desenvolvimento em grandes equipes, podia se conectar com qualquer banco de dados e de vários modos diferentes, além de possuir uma gama de componentes de todos os tipos, desde os Open Source, como o famoso pacote de componentes Russo chamado RX, até componentes empresariais relacionado a dados e ao visual da aplicação como o InfoPower e 1st Class da empresa Woll2Woll.

O Delphi também possuía vários componentes para relatório onde podia-se  utilizar o poder da sua conexão com o banco de dados Oracle, unidos aos recursos de seus componentes, também possuía integração com o gerador de relatório mais famoso do mundo o Cristal Reports que hoje pertence a SAP.

Outro ponto forte do Delphi é que era possível programar rotinas em Assembler dentro do Object Pascal apenas abrindo um bloco ASM e dizendo direto ao hardware o que o desenvolvedor gostaria de fazer. O Delphi também possuía várias rotinas Assembler como parte de seus comandos como o caso do comando Abort, para ver estas rotinas bastava clicar em cima do comando em questão escrito de qualquer Unit pascal  e pressionando o botão Control (CTRL + Click)  e automaticamente você seria levado ao código que o originava, assim como nas IDEs de hoje em dia.

Assembler Delphi: http://docwiki.embarcadero.com/RADStudio/XE3/en/Using_Inline_Assembly_Code

Com o “Boom” do Linux em 2001 foi lançada uma versão para esta plataforma chamada Kylix,  com o lançamento do Delphi 8 a linguagem passou a suportar o .NET Framework, podendo-se escrever programas C# direto de sua IDE, mas não vingou e  muitas empresas estacionaram seu desenvolvimento na versão 7 do Delphi. O Delphi hoje é marca registrada da empresa Embarcadero e está na sua versão XE10 (emprestando a estratégia de versão do Windows 10) no qual pode-se desenvolver aplicações verdadeiramente nativas para Windows, Mac, Android e iOS a partir de uma única base de código.

Delphi 7 - Win32

Delphi 7 – Win32

Desenvolvimento em Delphi vale a pena migrar para Java ou C#?

Bom,  então, para quem migrou da versão 7 do Delphi para suas versões superiores e utilizou o suporte a plataforma .Net não temos muito o que falar, pois C# lembra muito o Java que por sua vez bebeu da fonte do C++ e assim por diante, mas para aqueles que continuam desenvolvendo em Delphi para Win32 a coisa é bem diferente.

Existe até uma URL estratégica da Embarcadero preparada para as pesquisas do Google:

UpGrade Delphi 7 para XE10: http://www.embarcadero.com/br/products/rad-studio/upgrade-from-delphi7

Programas escritos em Delphi 7, suas versões anteriores ou versões superiores mas utilizando projetos de código nativo ainda são comuns e a pergunta mais frequente é se vale a pena migrar para Java ou C#?

A resposta é simples, sim! Vale a pena mudar!

Por que ?

Ao contrario do que a maioria pensa (que me digam os proprietários de software houses que ainda desenvolve em Delphi código nativo)  desenvolver para Win32 exige um conhecimento muito técnico das APIs do Windows, apesar do Delphi transformar esta programação em uma tarefa extremamente fácil (vide Visual Studio MFC C++ para Win32) o resultado algumas vezes pode não ser aquele desejado pelos proprietários de software house, nem pelos clientes e nem pelos programadores.

Na pratica existem muitos programas escritos em Delphi para Win32 que são lentos, mesmo usando o melhor banco de dados do mundo, o Oracle, sem entrar no mérito das melhores praticas para um banco de dados. Muitos programas geram erros de memoria sozinhos, apenas com o usuário o utilizando, são difíceis de dar manutenção e não são projetados para o crescimento da base de dados, e pasmem, existem programas que param de funcionar devido a lentidão quando utilizados em bases de dados de grande porte (entrando no mérito das melhores praticas para um banco de dados), gerando para as empresas uma legião de clientes insatisfeitos, se identificou?

Mas o problema não é do Delphi e nem das APIs do Windows e sim da técnica dos programadores principalmente de programas que já foram migrados do Cobol, Clipper, DataFlex entre outras linguagens na qual se utiliza bases de dados relativamente grandes. Um erro comum era não conhecer o sistema operacional e não usar Dlls e ActiveX, criando Units de código pascal para as bibliotecas e programas reutilizáveis que eram referenciadas entre si e compiladas junto com o executável o tornando enorme, além disto, necessitando deste modo criar grande quantidade de procedimentos e funções publicas para estas Units ou Forms também referenciados (quando a convenção para qualquer linguagem orientada a objeto diz que você deve sempre criar métodos privados e usar métodos públicos somente quando realmente for necessário). A consequência deste tipo de programação é sem duvida, vazamento de memoria (Memory Leak), visto que apenas o Delphi com suporte ao .NET Framework possui o Garbage Collector, além de códigos fonte crescendo desordenadamente ao longo dos anos, sem contar outros inúmeros conceitos da programação para Win32 que continuaram sendo completamente ignorados.

Dinamic-Link Library: http://msdn.microsoft.com/en-us/library/windows/desktop/ms681914(v=vs.85).aspx

Component Object Model: http://msdn.microsoft.com/en-us/library/windows/desktop/ms694363(v=vs.85).aspx

Delphi ActiveX Framework: http://docwiki.embarcadero.com/RADStudio/XE3/en/Overview_of_COM_Technologies

Memory Leak Delphi: http://delphi.about.com/od/oopindelphi/a/memoryleak.htm

Para quem não teve estes problemas ainda possui um software plenamente funcional, rápido e com um pouco mais de trabalho pode se desenvolver qualquer coisa que é feita hoje em dia, pois a Microsoft garante a compatibilidade da API Win32 (conceito que significa código nativo e não só para 32 bits). Assim como o modelo de  programas em Delphi escritos em código nativo, nos dias hoje a Microsoft disponibiliza este tipo de  ferramenta apenas para C++, e este tipo de programação não pode ser desenvolvida à partir de uma versão Express do Visual Studio, pois a aplicação nativa é ideal para softwares coorporativos por ser consideravelmente mais rápida do que aplicações utilizando o framework.

Código Nativo – Win32 : http://msdn.microsoft.com/pt-br/library/hh875053.aspx

Delphi possui a melhor IDE RAD de todos os tempos, suporta vários tipos de conexões incluindo os melhores bancos de dados do mundo, é multi-plataforma, possui código nativo com acesso pleno a API de plataforma, incluindo plataformas mobiles.

Embarcadero: https://www.embarcadero.com/br

Delphi Language: http://docwiki.embarcadero.com/RADStudio/XE3/en/Language_Overview

Rad Studio XE7

RAD Studio XE7

Migração Delphi – Java ou C#

Muitos proprietários e gerentes de TI se deixam levar por toda propaganda em torno das linguagens Java e C#, o que você deve lembrar é que você esta lidando com a Oracle e a Microsoft e um orçamento enorme para marketing mundial, isto significa que os softwares principais ou seja, produtos de primeira linha para o segmento empresarial que fazem praticamente tudo e estão no topo da tecnologia, os “ERPs” das grandes empresas fornecidos pela Oracle e Microsoft que provavelmente são concorrentes direto, senão em um todo em algum módulo do produto que você planeja desenvolver e possivelmente são vendidos por um valor muito maior do que seu produto final será, estes produtos topo de linha não foram desenvolvidos e nem utilizam Java e .NET, o Oracle JDEdwards utiliza Event Rule Language, C e C++ e o Microsoft Dynamics AX (C++) utiliza sua IDE MorphX e a linguagem X++ e foi desenvolvido originalmente pela IBM, então você não deve tornar nenhuma das marcas registradas seu time do coração antes de conhecer as mesmas razoavelmente. Não pense que você vai desenvolver o próximo JDE ou Dynamics usando Java ou C#, até porque os bancos de dados renomados fabricados pelas mesmas empresas detentoras dos ERPs possuem Features exclusivas para os mesmos e assim também acontece com o SAP R/3 que é líder no mercado empresarial e a Oracle e a Microsoft se orgulham em dizer que seus bancos de dados são certificados para as aplicações SAP.

É claro que você pode desenvolver ótimos e robustos softwares com as linguagens Java e C# mas tenha em mente que investir em infraestrutura, conhecimento técnico e funcional é muito importante, por isto se você é testemunha de problemas descritos no tópico acima simplesmente migrar para uma destas linguagens por si só não vai resolver seu problema, muito pelo contrario, Java é baseado em C++ e C# é baseado em Java, assim o conceito de objetos, classes, coleções, iteradores entre outros, demanda uma curva de aprendizado relativamente maior que o aprendizado exigido pela linguagem Object Pascal, sem contar que o programador também deve conhecer como funciona o sistema operacional em questão independente da linguagem ser ou não multi plataforma.

Dependendo do tipo de projeto, hoje, também vale a pena utilizar linguagens que vem ganhando muito espaço no mercado internacional e no Brasil, como Ruby e Python que possuem uma comunidade muito ativa. No exterior Python é ensinado a crianças nas escolas e muitos a veem como uma linguagem do futuro. Estas linguagens são multi plataforma, muito versáteis e puramente orientadas a objeto, apesar do Python não possuir oficialmente esta classificação é bem similar ao Ruby, na verdade Ruby que foi inspirado em Python, e de qualquer modo Python e Ruby possuem uma orientação a objeto mais pura que Java e C# pois não possuem tipos primitivos possibilitando cortar alguns caminhos na hora da codificação, além do beneficio de que as duas linguagens possuem uma sintaxe simples e minimalista, fazem a mesma coisa requerendo muito menos linhas de código e ainda por cima de um modo mais fácil.

Já o Java e o C# herdam a sintaxe e conceitos do C++, inclusive o C# trouxe do C++ muita coisa que o Java aboliu, como ponteiros e Structs, as duas linguagens na pratica são muito similares e ambas já são linguagens conceituadas. Uma vantagem é que Java, Ruby e Python são linguagens que possuem muitos frameworks de código aberto sob diversas licenças, evoluem mais rápido do que o C# que vai incorporar as novidades só em sua próxima versão ou na próxima versão do Windows que agregará novas tecnologias, muitas delas vindas ou inspiradas no código aberto, como vários frameworks Java que também foram escritos para C# mais tarde, e o próprio ASP.NET MVC que foi e ainda é altamente influenciado pelo framework Rails.

Entretanto a Microsoft já se mobilizou para tentar mudar esta situação criando uma serie de medidas, lançando uma versão comunitária do Visual Studio, adotando o Python e outras linguagens e as integrando ao Visual Studio, firmando parcerias com empresas como a Apache incorporando o Apache Córdoba e a empresa Xamarim que patrocina o Mono (Linux) e é proprietária da plataforma Xamarim (OS X e Android), outra medida também foi abrir o código fonte da tecnologia ASP.NET tornando seus frameworks abertos sob a licença Apache, para que possam sofrer mais influencias da comunidade de código aberto, pretende também em um futuro próximo, abrir o código do núcleo do .Net Framework para que se torne autossuficiente em outras plataformas. Influencia esta que o Java e outras linguagens já possuem e atuam fortemente em todas as plataformas (Unix, Linux, Windows, OS X e diversos devices), inclusive na tecnologia Cloud, onde a Oracle proprietária do Java há tempos já lançou o primeiro sistema operacional exclusivo para as nuvens, o Oracle Solaris 11, em contrapartida as varias distribuições Linux Enterprise como a RedHat também estão investindo fortemente na plataforma Cloud, como por exemplo a plataforma hibrida OpenShift que suporta serviços em varias linguagens e bancos de dados diferentes, enquanto a Microsoft foca exclusivamente na sua tecnologia Azure, MSSQL Server, na interoperabilidade com o sistema operacional Linux Suse Enterprise e em suas novas parcerias.

Durante todas estas reviravoltas tecnológicas no universo do código aberto e no mundo proprietário, batalhas judiciais pelas patentes de softwares e devices, o Delphi apenas corre atrás das velhas novidades, ainda tentando mover usuários (sem perde-los) de sua plataforma Win32 para as suas novas plataformas proprietárias (livre somente de royalts) que competem com vários outros frameworks mais atuais, muitos deles de código aberto e ou gratuitos.

Conectividade Delphi: http://www.embarcadero.com/br/products/delphi/connect

Uma das mais famosas bibliotecas C++ no qual Java e C# foram baseados:

Standard Template Library: http://msdn.microsoft.com/en-us/library/c191tb28.aspx

STL/CLR Library: http://msdn.microsoft.com/en-us/library/bb385954.aspx

JCF – Framework: http://docs.oracle.com/javase/tutorial/collections/intro

No Brasil a linguagem de programação C# é a queridinha das empresas de pequeno e médio porte, isto é devido as diversas ações que a Microsoft executa no mercado nacional com seus programas, entre eles as certificações com escolas credenciadas, Microsoft Partners e inúmeras convenções e encontros, já o Java atua soberano no mercado de software para Main Frames e Devices, desenvolve-se em Java também dentro de softwares de grande porte, incluindo softwares da Oracle, IBM, Google e SAP, como no banco de dados Oracle e IBM DB2, que rodam rotinas em Java, além destas quatro companhias também possuírem uma IDE exclusiva para programar em Java, elas são NetBeans (Oracle), Eclipse (IBM), Android Studio (Google) e NetWeaver para Java da SAP, em sua nova tecnologia para as nuvens SAP HANA a SAP adota a IDE Eclipse como sua nova plataforma de desenvolvimento. Sem contar outras inúmeras tecnologias profissionais e servidores de aplicações Enterprise para Java como Oracle WebLogic, IBM WebSphere, TomCat da Apache, JBoss da Red Hat.

Fora do Brasil o C# esta qualificado com apenas 7.4% no ranking de linguagens mais procuradas pelas empresas, enquanto Java possui 19,6%, segundo o site CodeEval o ranking das linguagens mais populares de 2015 são: Ranking Code Eval.

Já no Tiobe Index 2015, a linguagem Java aparece em segundo lugar, C# ocupa a quarta posição enquanto Delphi desde 2013 se localiza abaixo da decima sétima posição, você pode conferir o ranking mensal da Tiobe aqui: Tiobe Index 2015. Nos dois índices Java e C# ocupam posições similares no ranking.

Uma ótima ilustração para os parágrafos acima pode ser utilizando a ótica da empresa SAP (Lider mundial de software corporativo). Seu principal produto o SAP R/3 para grandes empresas utiliza opcionalmente Java como linguagem de desenvolvimento e também no núcleo algumas de suas aplicações, já seu produto para pequenas empresas chamado Business One utiliza .NET. Independe dos motivos quem conhece as duas aplicações sabe da diferença enorme da tecnologia entre elas.

Para uma comparação técnica completa entre Java e C#, utilize o link a seguir:

C# for Java Developers: http://msdn.microsoft.com/en-us/library/ms228358(v=vs.90).aspx

Legados do Delphi

Java

Se tratando do Java seu conceito de objetos e sintaxe são baseados em C++ e em bibliotecas como a STL (Standard Template Library), mas o Delphi deixou um importante legado que é a IDE visual do NetBeans, originalmente denominada Xelfi e desenvolvida na República Tcheca em 1996. O objetivo era escrever uma IDE Java similar ao Delphi. O Xelfi foi a primeira IDE escrita em Java e posteriormente comprada pela SUN, que hoje pertence a Oracle e os exemplos oficiais são escritos para está IDE, inclusive a plataforma Java SEEE podem ser baixadas em pacotes (Bundle) que já contemplam o NetBeans, o servidor de aplicação GlassFish e os plugins para sua interface RAD (Desktop com Java Swing, Java FX e Web).

NetBeans History: https://netbeans.org/about/history.html

C#

Microsoft já namorava o arquiteto por trás do Delphi e de seu predecessor Turbo Pascal foi Anders Hejlsberg, onde se tornou o arquiteto responsável pelo projeto do C# e foi peça chave na criação do ambiente Microsoft .NET. Então é de se supor que o C# leva um pouco do Delphi dentro de si e podemos ver isto claramente na sintaxe de algumas instruções, principalmente no que se refere ao conceito de Eventos (Sender) e Setter (Getter e Setter).

C# Language: http://msdn.microsoft.com/pt-br/library/z1zx9t92.aspx

Métodos Getter e Setter

Em Java, C++ e C# existe o conceito de Getter e Setter  (inclusive sintaxe idênticas) para métodos de classe que em Delphi seria “equivalente” a uma Function e uma Procedure. Java e C++ seguem o padrão comum para o método Setter, em C# a Microsoft ensina o conceito como do Java quando você cria uma classe, o Visual Studio possui um atalho para criar Getter e Setter automaticamente mas não utilizando métodos, assim como os objetos do framework usam a sintaxe do Delphi, embutindo o conceito de Getter e Setter dentro de uma propriedade ou seja um método Getter para Java e C++, exemplo:

Getter e Setter  – Java: http://docs.oracle.com/javaee/6/tutorial/doc/gjbbp.html

Getter e Setter – C#: http://msdn.microsoft.com/en-us/library/w86s7x04.aspx

Então em C# é possível utilizar o conceito comum de Getter e Setter baseado em C++ e Java, utilizar o conceito de Get e Set embutido dentro de um método Getter (propriedades em C#) é meramente opcional e apenas uma questão de sintaxe do objeto, no qual desenvolvedores Delphi estão bem familiarizados. Inclusive o conceito propriedades nos objetos C#, torna a IDE do Visual Studio, na questão pratica do ponto de vista do desenvolvedor muito similar a IDE do Delphi.

Delphi Properties: http://docwiki.embarcadero.com/RADStudio/XE3/en/Properties

Código Fonte Java e C#


// Java

Objeto.setVisible(True); // Setter

// C# e Delphi (Propriedades)

Objeto.Visible = True; // Setter porem igual ao Delphi*

// * O conceito de operadores Java e C# são iguais
//   Delphi usa := para atribuir um valor

Eventos – Windows (Win32) – Java – C#

Outra similaridade do C# com o Delphi são os eventos, o conceito de eventos do Windows a grosso modo é uma fila de mensagens que pode ser utilizado pela API através da função WindowProc ou WndProc e é mais similar ao Java que utiliza tipos de mensagens implementadas na classe (ActionListener, ItemListener, MouseListner e outros) por exemplo, o Java possui um ActionListner que identifica o evento de  clique de qualquer botão independente da quantidade de botões em um formulário utilizando apenas um método, já o C# assim como Delphi e a IDE RAD do NETBEANS para JAVA tornam está funcionalidade mais fácil porem geram um código maior criando um evento de clique para cada botão da tela.

WindowProc: http://msdn.microsoft.com/pt-br/library/ms633573.aspx

Windows Messages: http://msdn.microsoft.com/pt-br/library/ms644927.aspx

Java Event Listner: http://docs.oracle.com/javase/tutorial/uiswing/events/intro.html

C# Event Handler: http://msdn.microsoft.com/en-us/library/system.eventhandler(v=vs.110).aspx

Assim, você pode testemunhar a “semelhança” do conceito de Object Sender entre Delphi e o .Net Framework (VB.NET e C#), utilize os links abaixo para entender a sintaxe final do evento de clique de um botão.

Object Sender Delphi: http://docwiki.embarcadero.com/RADStudio/XE4/en/Using_the_Sender_Parameter

Object Sender .NET Framework: http://msdn.microsoft.com/en-us/library/aa457091.aspx

Soluções e Projetos

Um ponto muito importante no desenvolvimento para o C# (Java já utilizava o Apache Ant e soluções recentes utilizam o Apache Maven) é que a Microsoft sabia da dificuldade de muitos programadores em utilizar o conceito Win32 na arquitetura do software e estruturação do código fonte, então o que em Delphi exigia abrir um projeto tipo Dll (não gerenciado) escrever uma biblioteca adequada, importar as funções para seu projeto principal e assim por diante. No Visual Studio surgiu o conceito de solução, que unido a um ambiente gerenciado torna possível criar vários projetos por solução,  onde o projeto principal contendo um Windows Form,  por exemplo gera um executável e os projetos desta solução contendo apenas biblioteca de classes geram automaticamente uma Dll (ambiente gerenciado) que é referenciada ao projeto principal e esta resolvido o problema que possuíamos no Delphi de alguns desenvolvedores criando executáveis enormes e códigos redundantes.

Solution and Project Basics: http://msdn.microsoft.com/en-us/library/b142f8e7.aspx

Concluindo

Vale a pena migrar para uma linguagem mais moderna sempre, inovação faz parte da área de software, todos nós só temos a ganhar, melhores ferramentas, técnicas mais modernas, maior produtividade, o importante é avaliar caso a caso e criar um projeto consistente e na medida para que este processo se realize da melhor maneira possível.

O que vimos neste post é apenas uma primeira visão da importância do Delphi e como o Delphi influenciou outras linguagens de programação. Para uma comparação mais precisa é necessário um projeto bem elaborado e fica a mensagem de que o Delphi  pode ter desaparecido da grande mídia mas continuará vivo por muito tempo.

Visual – SplitContainer – C#

Publicado: 25 de abril de 2014 em C#

Painel deslizante é um componente da interface gráfica que permite que o usuário redimensione componentes contidos normalmente dentro de dois painéis que podem ser posicionados na horizontal ou na vertical.

SplitContainer

Representa um controle que consiste de uma barra móvel que divide a área de exibição de um recipiente em dois painéis redimensionáveis​​.

SplitContainer

SplitContainer

Exemplo:

Neste exemplo criamos um painel de rolagem divido na horizontal que contem dois componentes que podem ser redimensionados pelo usuário, respeitando o tamanho mínimo de cada componente.

C#

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

namespace paineldeslizante
{
    public partial class Form1 : Form
    {
        // Declara componentes
        SplitContainer painel;
        PictureBox imagem;
        RichTextBox area;

        // Declara variaveis
        String txt = "O balonismo é um esporte aeronáutico praticado com um balão de ar quente.\n" +
                     "Possui adeptos em todo o mundo. No Brasil, o esporte começou a se popularizar\n" +
                     "a partir dos anos 90.\n" +
                     "O balão é considerado uma aeronave assim como avião, helicópteros e outros.\n" +
                     "Por esta razão o balão deve ter uma matricula (prefixo) registrado junto\n" +
                     "à ANAC, seu piloto deve possuir uma licença (brevê) específico para a pratica\n" +
                     "do balonismo também emitido pela ANAC.";

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Shown(object sender, EventArgs e)
        {
            // Define propriedades do formulario
            this.Text = "DA - Painel Deslizante";
            this.Size = new Size(500, 300);

            // Cria componentes
            painel = new SplitContainer();
            imagem = new PictureBox();
            area = new RichTextBox();

            // Define tamanho minimo dos componentes
            imagem.MinimumSize = new Size(200, 100);
            area.MinimumSize = new Size(200, 100);

            // Define texto
            area.Text = txt;
            
            // Define limites dos componentes
            painel.Dock = DockStyle.Fill;
            imagem.Dock = DockStyle.Fill;
            area.Dock = DockStyle.Fill;
                      
            // Carrega imagem da internet
            imagem.ImageLocation = "https://desenvolvimentoaberto.org/wp-content/uploads/2014/04/balonismo.jpg";
            imagem.SizeMode = PictureBoxSizeMode.CenterImage;

            // Adiciona paineis no container
            painel.Panel1.Controls.Add(imagem);
            painel.Panel2.Controls.Add(area);

            // Adiciona painel ao formulario
            this.Controls.Add(painel);

        }
        
    }
}

Em computação caixas de diálogo reutilizáveis ​​que são comuns a todas as aplicações, incluindo caixas de diálogo para abrir arquivos, salvar arquivos e impressão. Uma vez que estas caixas de diálogo são implementadas pelo sistema operacional, ou classes no caso de linguagens multi plataforma,  podem ser compartilhadas entre todos os aplicativos que são executados no sistema operacional, o que ajuda o usuário a experiência de consistência; quando os usuários estão familiarizados com o uso de uma caixa de diálogo de funcionamento fornecido pelo sistema em um aplicativo, eles não precisam aprender a usar essa caixa de diálogo em outras aplicações. Como essas caixas de diálogo estão disponíveis para todas as aplicações e porque ajudam a proporcionar uma experiência de usuário consistente.

Diálogos - Windows

Diálogos – Windows

OpenFileDialog

Solicita ao usuário abrir um arquivo.

SaveFileDialog

Solicita que o usuário selecione um local para salvar um arquivo.

StreamReader

Implementa um leitor de texto que lê caracteres a partir de um fluxo de bytes em uma codificação específica.

StreamWriter

Implementa um escritor de texto para escrever caracteres para um fluxo em uma codificação específica.

Exemplo:

Neste exemplo usamos as caixas de diálogos no modo abrir e salvar arquivos para executar estes eventos sobre uma área de texto através de um Stream de escrita e leitura.

C#

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

// Adiciona namespace de manipulação de Entrada e Saida
using System.IO; 

namespace Dialogoscs
{
    public partial class Form1 : Form
    {
        // Declara componentes
        Label rotulo;
        RichTextBox texto;
        Button botao1, botao2;
        OpenFileDialog abrir;
        SaveFileDialog salvar;
        StreamReader ler;
        StreamWriter gravar;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Shown(object sender, EventArgs e)
        {
            // Define texto do formulario
            this.Text = "DA - Dialogos";

            // Cria componentes
            rotulo = new Label();
            texto = new RichTextBox();
            botao1 = new Button();
            botao2 = new Button();

            // Define tamanho dos componentes
            rotulo.Size = new Size(300,20);
            texto.Size = new Size(240,170);

            // Define posição dos componentes
            rotulo.Location = new Point(0, 10);
            texto.Location = new Point(20, 30);
            botao1.Location = new Point(20, 220);
            botao2.Location = new Point(100, 220);

            // Define propriedades dos componentes
            rotulo.Text = "Digite abra ou salve um texto";
            rotulo.TextAlign = ContentAlignment.TopCenter;

            texto.ScrollBars = RichTextBoxScrollBars.Vertical;

            botao1.Text = "Abrir";
            botao2.Text = "Salvar";

            // Cria eventos para os botões
            botao1.Click += new System.EventHandler(this.botao1_Click);
            botao2.Click += new System.EventHandler(this.botao2_Click);

            // Adiciona componentes ao formulario
            this.Controls.Add(rotulo);
            this.Controls.Add(texto);
            this.Controls.Add(botao1);
            this.Controls.Add(botao2);

        }

        private void botao1_Click(object sender, EventArgs e)
        {
            // Abre e define propriedades para um dialogo
            abrir = new OpenFileDialog();
            abrir.Filter = "Textos (*.txt)|*.txt";

            if (abrir.ShowDialog() == DialogResult.OK)
            {

                // Lê um arquivo definido no dialogo
                using( ler = new StreamReader(abrir.OpenFile()))
                {
                    String linha = ler.ReadToEnd();
                    texto.Text = linha;

                }
            }

        }

        private void botao2_Click(object sender, EventArgs e)
        {
            // Abre e define propriedades do dialogo
            salvar = new SaveFileDialog();
            salvar.Filter = "Textos (*.txt)|*.txt";

            if (salvar.ShowDialog() == DialogResult.OK)
            {
                // Grava um arquivo baseado na area de texto
                using(gravar = new StreamWriter(salvar.OpenFile()))
                {
                    gravar.Write(texto.Text);
                }
            }
        }
    }
}

Visual – ToolBar, ToolButton e ImageList – C#

Publicado: 17 de abril de 2014 em C#

A Barra de ferramentas é um componente utilizado pelos softwares com interface gráfica (GUI) com a finalidade de permitir uma ação rápida por parte do usuário, facilitando o acesso a funções do programa. Uma das suas características é possuir ícones para as operações mais corriqueiras e representar através de imagens operações que poderiam demandar uma grande quantidade de informações para chegar ao mesmo objetivo

ToolBar

Representa uma barra de ferramentas do Windows. Embora ToolStrip substitui e adiciona funcionalidade para o ToolBar em versões anteriores, ToolBar é mantido para compatibilidade com versões anteriores e o uso futuro, se você escolher.

ToolButton

Representa um botão da barra de ferramentas do Windows. Embora ToolStripButton substitui e estende o controle ToolBarButton das versões anteriores, ToolBarButton é mantido para compatibilidade com versões anteriores e o uso futuro, se você escolher.

ImageList

Fornece métodos para gerenciar uma coleção de objetos de imagem. Esta classe não pode ser herdada.

Exemplo:

Neste exemplo criamos uma barra de tarefas utilizando botões e seus eventos de clique. Para testar este exemplo você precisa de imagens de ícones do formato PNG, as imagens podem ser baixadas neste link: http://www.iconesbr.net/icone/Linux

C#

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

namespace toolbarcs
{
    public partial class Form1 : Form
    {
        // Declara componentes
        Label rotulo;
        ToolBar ferramenta;
        ImageList imagens;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Shown(object sender, EventArgs e)
        {
            // Define propriedades do formulario
            this.Text = "DA - Barra de Ferramentas";
            this.Size = new Size(300, 150);

            // Cria componentes
            rotulo = new Label();
            ferramenta = new ToolBar();
            imagens = new ImageList();

            // Define propriedades do rotulo
            rotulo.Text = "Eventos do botão.";
            rotulo.Size = new Size(250, 20);
            rotulo.Location = new Point(0, 50);
            rotulo.TextAlign = ContentAlignment.TopCenter;

            // Adiciona imagens
            imagens.Images.Add(Image.FromFile("C:\\Desenvolvimento Aberto\\9445_128x128.png"));
            imagens.Images.Add(Image.FromFile("C:\\Desenvolvimento Aberto\\9450_128x128.png"));
            imagens.Images.Add(Image.FromFile("C:\\Desenvolvimento Aberto\\9451_128x128.png"));

            // Liga imagens a barra de ferramentas
            ferramenta.ImageList = imagens;

            // Cria botões da barra de ferramentas
            ToolBarButton bnt1 = new ToolBarButton();
            ToolBarButton bnt2 = new ToolBarButton();
            ToolBarButton bnt3 = new ToolBarButton();           

            // Define imagens dos botões
            bnt1.ImageIndex = 0;
            bnt2.ImageIndex = 1;
            bnt3.ImageIndex = 2;

            // Adiciona botões as barras de ferramentas
            ferramenta.Buttons.Add(bnt1);
            ferramenta.Buttons.Add(bnt2);
            ferramenta.Buttons.Add(bnt3);

            // Cria evento para a barra de ferramentas
            ferramenta.ButtonClick += new ToolBarButtonClickEventHandler( this.ferramenta_ButtonClick);

            // Adiciona componentes ao formulario
            this.Controls.Add(ferramenta);
            this.Controls.Add(rotulo);

        }     

         private void ferramenta_ButtonClick (Object sender, ToolBarButtonClickEventArgs e)
        {
             // Captura clique da barra de ferramentas
            switch (ferramenta.Buttons.IndexOf(e.Button))
            {

                case 0:
                    rotulo.Text = "Você clicou no botão 1";
                    break;

                case 1:
                    rotulo.Text = "Você clicou no botão 2";
                    break;

                case 2:
                    rotulo.Text = "Você clicou no botão 3";
                    break;

            }

        }

    }
}

 

Visual – TreeView – TreeNode – C#

Publicado: 15 de abril de 2014 em C#

Em computação, um tree view (literalmente do inglês vista de árvore) é um elemento de interface gráfica (isto é um componente widget) que permite ao usuário mostrar dados hierárquicos em forma de árvore, expandir ou recolher os ramos e nós. Dependendo do wiget toolkit ou aplicação em uso, existem muitos estilos de apresentação gráfica de tree views.

TreeView

Exibe uma coleção hierárquica de itens rotulados, cada um representado por um TreeNode.

TreeNode

Representa um de um TreeView.

treeviewcs

Tree View

 

Exemplo:

Neste exemplo usamos uma visão de arvore para exibir uma discografia musical, você pode abrir e fechar os nós do modelo de dados em visão de  árvore, um duplo clique do mouse em cada nó dispara um evento para que exibido a descrição do nó corrente em um rodapé.

C#

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

namespace Arvorecs
{
    public partial class Form1 : Form
    {
        // Declara componentes
        Label rotulo;
        Label rodape;
        TreeView disco;

        // Declara variaveis e Arrays
        String albumB = "Please, Please Me";

        String[] MusicaB = {  "I Saw Her Standing There",  "Misery",  "Anna (Go to Him)",
                "Chains" ,  "Boys" , "Ask Me Why",  "Please Please Me",  "Love Me Do" ,
                "P.S. I Love You",  "Baby It's You",  "Do You Want To Know A Secret?",
                "A Taste of Honey",  "There's A Place",  "Twist and Shout"  };

        String albumR = "The Rolling Stones";

        String[] MusicaR ={ "Route 66", "I Just Want to Make Love to You", "Honest I Do",
               "Mona (I Need You Baby)",  "You Can Make It If You Try", "Little by Little",
               "I\'m a King Bee", "Carol", "Tell Me (You \'re Coming Back)", "Can I Get a Witness",
               "Tell Me (You\'re Coming Back)",  "Walking the Dog" };   


        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Shown(object sender, EventArgs e)
        {
            // Define propriedades do formulario
            this.Text = "DA - TreeView";
            this.Size = new Size(350, 600);

            // Cria componentes
            rotulo = new Label();
            rodape = new Label();
            disco = new TreeView();
            
            // Define texto dos componentes
            rotulo.Text = "Duplo clique em um nó da arvore:";
            rodape.Text = "Evento do mouse";

            // Define tamanho dos componentes
            rotulo.Size = new Size(300, 20);
            rodape.Size = new Size(300, 20);
            disco.Size = new Size(300, 500);

            // Alinha textos
            rotulo.TextAlign = ContentAlignment.TopCenter;
            rodape.TextAlign = ContentAlignment.TopCenter;

            // Posiciona componentes
            rotulo.Location = new Point(10, 10);
            rodape.Location = new Point(10, 540);
            disco.Location = new Point(10, 30);

            // Cria nós da arvore
            TreeNode titulo = new TreeNode("Discografia");
            TreeNode b1 = new TreeNode("Beatles");
            TreeNode b2 = new TreeNode("Rolling Stones");

            TreeNode a1 = new TreeNode(albumB);
            TreeNode a2 = new TreeNode(albumR);

            // Adiciona nós na arvore e sub-nós
            titulo.Nodes.Add(b1);
            titulo.Nodes.Add(b2);

            b1.Nodes.Add(a1);
            b2.Nodes.Add(a2);

            TreeNode m1 = new TreeNode();
            TreeNode m2 = new TreeNode();

            for (int i = 0;  i < MusicaB.Length ; i++)
            {
                m1 = new TreeNode(MusicaB[i]);
                a1.Nodes.Add(m1);

            }

            for (int i = 0; i < MusicaR.Length; i++)
            {
                m2 = new TreeNode(MusicaR[i]);
                a2.Nodes.Add(m2);

            }

           // Adiciona nó principal
            disco.Nodes.Add(titulo);

            // Evento da arvore
            disco.DoubleClick += new System.EventHandler(this.disco_DoubleClick);

            // Adiciona componentes no formulario
            this.Controls.Add(rotulo);
            this.Controls.Add(rodape);
            this.Controls.Add(disco);

        }

        private void disco_DoubleClick(object sender, EventArgs e)
        {
            // Seleciona nó corrente
            rodape.Text = disco.SelectedNode.ToString();
        }
    }
}

Ao contrario da linguagem de programação Java o C# não possui um controle de grid para se trabalhar desconectado de um banco de dados, para realizar esta funcionalidade o C# permite usar o controle utilizado para exibição de arquivos do Windows Explorer para simular uma exibição de grade de dados utilizando Arrays ou Strings.

listview-cs

List View

 

ListView

Representa um controle  de lista de exibição do Windows , que exibe uma coleção de itens que podem ser exibidos usando um dos quatro pontos de vista de diferentes estilos contidos no sistema operacional: Ícones grandes, Ícones pequenos, lista, detalhes.

Exemplo:

Neste exemplo usamos um controle de lista para simular uma grade de dados com conteúdo  baseado em caracteres literais.

C#

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

namespace tabela_cs
{
    public partial class Form1 : Form
    {
        // Declara componente
        ListView tabela;
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Shown(object sender, EventArgs e)
        {
            // Define propriedades do formulario
            this.Text = "DA - List View Control - Grid";
            this.Size = new Size(500, 250);

            // Cria componente de lista
            tabela = new ListView();

            // Define tamanho e localização
            tabela.Size = new Size(440, 170);
            tabela.Location = new Point(20, 20);
            
            // Define estilo de exibição
            tabela.View = View.Details;
            
            // Define estilo do conteudo
            tabela.GridLines = true;
            tabela.FullRowSelect = true;
            tabela.AllowColumnReorder = true;

            // Adiciona colunas
            tabela.Columns.Add("Album");
            tabela.Columns.Add("Artista");
            tabela.Columns.Add("Musica");
            tabela.Columns.Add("Ano");
            tabela.Columns.Add("Videoclip");

            // Cria itens e conteudo de linhas
            ListViewItem item1 = new ListViewItem("Nevermind", 0);
            ListViewItem item2 = new ListViewItem("Ten", 1);
            ListViewItem item3 = new ListViewItem("Facelift", 2);
            ListViewItem item4 = new ListViewItem("Badmotorfinger", 3);
            ListViewItem item5 = new ListViewItem("Sweet Oblivion", 4);
            ListViewItem item6 = new ListViewItem("Core", 5);

            // Adiciona conteudo das colunas
            item1.SubItems.Add("Nirvana");
            item1.SubItems.Add("Smell Like Teen Spirit");
            item1.SubItems.Add("1991");
            item1.SubItems.Add("Sim");
         
            item2.SubItems.Add("Pearl Jam");
            item2.SubItems.Add("Jeremy");
            item2.SubItems.Add("1991");
            item2.SubItems.Add("Sim");

            item3.SubItems.Add("Alice in Chains");
            item3.SubItems.Add("Man in the Box");
            item3.SubItems.Add("1990");
            item3.SubItems.Add("Sim");
         
            item4.SubItems.Add("SoundGarden");
            item4.SubItems.Add("Outshined");
            item4.SubItems.Add("1991");
            item4.SubItems.Add("Sim");

            item5.SubItems.Add("Screaming Trees");
            item5.SubItems.Add("Nearly I Lost You");
            item5.SubItems.Add("1993");
            item5.SubItems.Add("Sim");

            item6.SubItems.Add("Stone Temple Pilots");
            item6.SubItems.Add("Plush");
            item6.SubItems.Add("1992");
            item6.SubItems.Add("Sim");

            // Arranja a grade de dados
            tabela.Items.AddRange(new ListViewItem[] { item1, item2, item3, item4, item5, item6 });

            // Adiciona grade ao formulario
            this.Controls.Add(tabela);
            
        }
    }
}