Malicioso "DataGridViewComboBoxCell" malicioso em vb.net e c #

Olá a todos, janelas de programação para MS VS.



Problema



1. Existe um DataGridView, uma das colunas é DataGridViewComboBoxColumn;

2. Os dados são lançados na grade por meio do DataSource, como um DataTable (não linha por linha, isso é importante);

3. Os dados no ComboBoxColumn também são vinculados, a fonte de dados tem um DataMember preenchido, linha por linha ou não - não importa, a estrutura de dados específica também não é importante, o ValueMember nele é Integer, Long ou mesmo String.



Ao selecionar algo na lista suspensa, dgv_DataError captura um erro: "Valor DataGridViewComboBoxCell inválido". E ao encher - ela.



Pesquisa



O Google distribuiu apenas duas páginas e meia de fóruns. Isso significa que o problema é generalizado, mas não pode ser resolvido no nível intermediário. Direções erradas de desenvolvimento do pensamento:

a) Após vincular os dados, percorra cada linha e use as alças para reatribuir o valor na célula, encontrando-o na lista.

b) Desligue o tratamento de dgv_DataError.



Ao mesmo tempo, ao preencher manualmente as linhas da tabela por meio de Rows.Add (), está tudo bem.



Meus colegas infelizmente tentaram descobrir o que havia de errado com a lista, mas o problema não estava nela, mas na incompatibilidade de tipo.



Historicamente, o MS SQL usa decimal para uma coluna com identidade ativada. Sim, é decimal (18,0), mas ainda permanece um tipo de dados fracionário. Concordo, é sempre conveniente ver a casa decimal do índice. Se eu espero até um milhão de registros por ano, então decimal (7,0) é suficiente para 10 anos e decimal (10,0) para 10000. Digamos que o Sol exploda em 5 bilhões de anos - vamos contar os dígitos: 6 + 9, isto é decimal (15.0) é o suficiente, e o padrão 18 - com uma margem.



E na lista temos Integer, Long ou mesmo String!



Nós preenchemos as linhas com canetas, o blockhead de ferro transforma implicitamente tudo fracionário e não fracionário para nós. Lento e confiável. E queremos isso rápido, mas a economia é alcançada incluindo a ausência de verificações e conversões de tipo desnecessárias.



Como resultado, temos dois problemas:

1. Ao carregar dados em uma tabela, em vez de nomes de títulos da lista, os IDs do banco de dados são exibidos na coluna.

2. Quando você seleciona um nome de cabeçalho na lista suspensa, o valor na célula não é atualizado.



Decisão



Se o banco de dados for muito, muito grande, antigo ou indisponível para o desenvolvedor da interface, use índices decimais na caixa de combinação.



Se for mais fácil mudar a estrutura das tabelas no banco de dados, então usar bigint para chaves estrangeiras é bom, é maior que decimal (18,0) por quase um bit inteiro e mais rápido.



All Articles