COMO: Estender a DataGridTextBoxColumn de formulário do Windows para exibir dados de outras tabelas usando o Visual Basic .NET

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 319082
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Para obter uma Microsoft Visual translation from VPE for Csharp .NET versão deste artigo, consulte 319076.

NESTA TAREFA

Sumário
Use este guia passo a passo para estender o controle do Windows Form DataGridTextBoxColumn para que você possa exibir dados de outras tabelas no DataGrid , efetivamente ingressar em dois ou mais tabelas relacionadas para fins de exibição.

Observação : esta técnica não é necessária se você usar controles individuais, pois você pode vinculá-las hierarquicamente.

O aplicativo de exemplo neste artigo demonstra como exibir campos das tabelas Pedidos, funcionários e clientes no banco de dados Northwind em um Windows Form DataGrid ao mesmo tempo. Os campos da tabela Orders são editáveis; os campos de tabelas de referência relacionados não são. Você pode selecionar um novo código do funcionário ou CódigoDoCliente para alterar os campos de tabela de referência automaticamente para refletir o novo valor.

A classe JoinTextBoxColumn deve ser mapeada para um campo na tabela muitos lado (no caso, pedidos), mesmo que ele exibe um campo da tabela de referência. O campo real não importa. No entanto, você não pode vincular mais de um estilo de coluna a um campo em DataView subjacente. Se você executar fora de campos, você pode adicionar alguns campos fictícios a DataTable e vincular a aqueles, como demonstrado no código Form.Load no aplicativo de exemplo.

back to the top

Aplicativo de exemplo

  1. Inicie o Visual Studio.NET e crie um novo aplicativo do Visual Basic Windows Forms.
  2. Adicionar uma referência ao System.Data.SQLClient na parte superior do arquivo Form1.vb:
    Imports System.Data.SqlClient					
  3. Adicione a seguinte declaração de variável de DataSet no nível da classe Form1:
    Private ds As DataSet					
  4. Adicione um controle DataGrid ao formulário.
  5. Clique duas vezes em plano de fundo do formulário. Digite ou cole o código a seguir para adicionar um manipulador de eventos Form1_Load para gerar dados de exemplo e inicializar o DataGrid para usar a classe JoinTextBoxColumn .
        '    ' Read the data and set relationships between the tables.    '    Dim cn As New SqlConnection("Server=localhost;uid=myuser;pwd=mypassword;Database=Northwind")    Dim daCust As New SqlDataAdapter("SELECT * FROM Customers", cn)    Dim daEmp As New SqlDataAdapter("SELECT * FROM Employees", cn)    Dim daOrd As New SqlDataAdapter("SELECT * FROM Orders WHERE CustomerID LIKE 'B%'", cn)    ds = New DataSet()    daCust.Fill(ds, "Cust")    daEmp.Fill(ds, "Emp")    daOrd.Fill(ds, "Ord")    ds.Relations.Add("CustOrd", ds.Tables!Cust.Columns!CustomerID, ds.Tables!Ord.Columns!CustomerID)    ds.Relations.Add("EmpOrd", ds.Tables!Emp.Columns!EmployeeID, ds.Tables!Ord.Columns!EmployeeID)    '    ' Add dummy fields for mapping the JoinTextBoxColumn styles.    ' Do this only if you are mapping more fields than    ' there are in the underlying DataTable. You can map the     ' JoinTextBoxColumn class to any column because it references    ' fields in another table.    '    With ds.Tables!Ord      .Columns.Add("FirstName", GetType(String))      .Columns.Add("LastName", GetType(String))      .Columns.Add("CompanyName", GetType(String))      .Columns.Add("ContactName", GetType(String))    End With    '    ' Map fields from all three tables. Use a standard    ' DataGridTextBoxColumn style for base table fields because they can    ' be updated. Use the JoinTextBoxColumn style for reference table    ' fields. These are read-only.    '    Dim ts As New DataGridTableStyle()    Dim cs As DataGridColumnStyle    cs = New DataGridTextBoxColumn()    cs.Width = 75    cs.MappingName = "OrderID"    cs.HeaderText = "Order ID"    ts.GridColumnStyles.Add(cs)    cs = New DataGridTextBoxColumn()    cs.Width = 75    cs.MappingName = "EmployeeID"    cs.HeaderText = "Emp ID"    ts.GridColumnStyles.Add(cs)    cs = New JoinTextBoxColumn("EmpOrd", ds.Tables!Emp.Columns!FirstName)    cs.Width = 120    cs.MappingName = "FirstName"    cs.HeaderText = "First Name"    ts.GridColumnStyles.Add(cs)    cs = New JoinTextBoxColumn("EmpOrd", ds.Tables!Emp.Columns!LastName)    cs.Width = 120    cs.MappingName = "LastName"    cs.HeaderText = "Last Name"    ts.GridColumnStyles.Add(cs)    cs = New DataGridTextBoxColumn()    cs.Width = 75    cs.MappingName = "CustomerID"    cs.HeaderText = "Cust ID"    ts.GridColumnStyles.Add(cs)    cs = New JoinTextBoxColumn("CustOrd", ds.Tables!Cust.Columns!CompanyName)    cs.Width = 120    cs.MappingName = "CompanyName"    cs.HeaderText = "Company"    ts.GridColumnStyles.Add(cs)    cs = New JoinTextBoxColumn("CustOrd", ds.Tables!Cust.Columns!ContactName)    cs.Width = 120    cs.MappingName = "ContactName"    cs.HeaderText = "Contact"    ts.GridColumnStyles.Add(cs)    cs = New DataGridTextBoxColumn()    cs.Width = 75    cs.MappingName = "OrderDate"    cs.HeaderText = "Ord. Date"    ts.GridColumnStyles.Add(cs)    ts.MappingName = "Ord"    DataGrid1.TableStyles.Add(ts)    DataGrid1.DataSource = ds    DataGrid1.DataMember = "Ord"					
  6. Altere a seqüência de conexão está sendo passada para o construtor SqlConnection para que contenha o nome de servidor correto, o nome de usuário e a senha para sua instância do SQL Server.
  7. Adicione a seguinte definição de classe ao arquivo Form1.cs. Você pode colocá-lo dentro da definição de classe Form1 ou fora a definição do formulário. Esse código contém a classe JoinTextBoxColumn que amplia a classe DataGridTextBoxColumn .
    Class JoinTextBoxColumn  Inherits DataGridTextBoxColumn  '  ' Store the information to get to a field in the referenced table.  '  Private m_RelationName As String  Private m_ParentField As DataColumn  Public Sub New(ByVal RelationName As String, ByVal ParentField As DataColumn)    m_RelationName = RelationName    m_ParentField = ParentField    MyBase.ReadOnly = True    ' this column's base style is read only  End Sub  Protected Overrides Function GetColumnValueAtRow(ByVal cm As CurrencyManager, ByVal RowNum As Integer) As Object    '    ' Get the current DataRow from the CurrencyManager.    ' Use the GetParentRow and the DataRelation name to get the parent row.    ' Return the field value from the parent row.    '    Try      Dim dr As DataRow = CType(cm.List, DataView).Item(RowNum).Row      Dim drParent As DataRow = dr.GetParentRow(m_RelationName)      Return drParent(m_ParentField).ToString()    Catch      Return "" ' handles NullReferenceException case when adding record    End Try  End Function  Protected Overrides Function Commit(ByVal cm As CurrencyManager, ByVal RowNum As Integer) As Boolean    '    ' Dummy implementation because it is read-only.    '    Return False  End Function  Public Shadows ReadOnly Property [ReadOnly]() As Boolean  '  ' Shadow the base property so it cannot be set.  ' Return TRUE so the DataGrid cannot allow edits.  '    Get      Return True    End Get  End PropertyEnd Class					
  8. Execute o aplicativo. DataGrid tem várias colunas. Além de colunas OrderID, CódigoDoCliente, CódigoDoFuncionário e OrderDate na tabela Pedidos, o DataGrid contém os campos FirstName e LastName dos funcionários tabela e os campos CompanyName e ContactName da tabela Customers.
  9. Editar os dados (Adicionar, excluir, modificar linhas). Os campos das tabelas funcionários e clientes são somente leitura. Se você editar os campos CódigoDoFuncionário ou CustomerID da tabela Pedidos, os campos referenciados refletirão a alteração.
back to the top

Solução de problemas

Alguns problemas comuns que você pode executar em quando você usa este código são:
  • Se você fornecer o objeto JoinTextBoxColumn um nome de DataRelation não existente, você poderá receber um erro de exceção quando DataGrid é processada. O erro de exceção não identifica qual linha de código causou o erro. Você pode recriar o construtor da classe para aceitar um objeto DataRelation para que esse tipo de erro pode ser detectado durante a fase de inicialização e isolar o problema para uma linha de código específica.
  • A coluna não é exibida a menos que você defina a propriedade Width . A configuração padrão é 0 (ocultado).
  • Os dados não são exibidos a menos que você definida a MappingName para objetos o DataGridTableStyle e DataGridColumnStyle e atribuí-los às suas respectivas coleções. O nome do mapeamento para o objeto JoinTextBoxColumn pode ser qualquer nome de campo; o campo real que é exibido é definido pelo construtor.
  • No cabeçalho da coluna ficará em branco se você não definir a propriedade HeaderText .
back to the top
DataView JOIN

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 319082 - Última Revisão: 12/07/2015 09:11:12 - Revisão: 3.2

Microsoft Visual Basic .NET 2003 Standard Edition, Microsoft Visual Basic .NET 2002 Standard Edition, Microsoft ADO.NET 1.1, Microsoft ADO.NET 1.0, Microsoft .NET Framework 1.1, Microsoft .NET Framework 1.0

  • kbnosurvey kbarchive kbmt kbhowtomaster KB319082 KbMtpt
Comentários