Tag Archives: C#

.NET – Corrigindo o erro DataGridViewComboBoxCell Value is not Valid

Se você ainda não esbarrou com este erro, está com sorte.

Quando acontece, é sempre no fechamento do formulário, sendo apresentado inúmeras vezes.

O erro apenas acontece se o autosizemode de uma coluna do tipo datagridviewcombobox estiver definido. Se o autosizemode não for definido, o erro não acontece.

Isso nos leva a duas situações :

O erro pode acontecer quando o autosizemode está definido a nível da DataGridView e existe uma coluna do tipo ComboBox na GridView

O erro pode acontecer quando o autosizemode está definido a nível de coluna e foi definido na coluna do tipo ComboBox

O erro ocorre porque no momento do fechamento do formulário, o formulário realiza primeiramente o dispose do datasource da coluna ComboBox. Quando o datasource é destruido e o autosize está definido, a ComboBox precisa recalcular o seu tamanho, então faz uma requisição por dados que não estão mais lá

Sem dúvida que desligar o autoSizeMode é uma solução, mas não desejamos isso, precisamos do autoSize

No momento em que o formulário for fazer o dispose do datasource da comboboxColumn, a ComboBoxColumn precisa estar com o autosizemode definido como None

Lembre-se que o autosizemode pode ser também definido no nível da grid, dai a diferença entre definir o autoSizeMode como None ou como NotSet

Então no evento form_Closed podemos simplesmente alterar o autosizemode da comboboxcolumn e com isso passaremos a poder utilizar o autoSize enquanto que o erro desaparecerá.

Lembre-se que cada coluna da DataGridView possui um nome e é uma variável acessível por código. Veja como fica :

NomeDaSuaColuna.AutoSizeMode =DataGridViewAutoSizeColumnMode.None;

Fonte: www.bufaloinfo.com.br

Abraços

Tomás Vásquez
www.tomasvasquez.com.br

C# – Preenchendo um dropdownlist com os valores de um Enum

A estrutura Enum é um recurso muito poderoso das linguagens de programação mais atuais, permitindo a criação do que gosto de chamar de “flags inteligentes”, que auxiliam tanto na visualização do código como na verficação de erros, muitas vezes em tempo de compilação.

O mais comum é utilizar Enums para facilitar a vida do próprio desenvolvedor. Porém, algumas vezes torna-se necessário fazer uma representação dos valores deste Enum na interface, mais comumente em um DropDownList.

Vamos supor então que tenhamos um Enum parecido com este:

1
2
3
4
5
6
7
public enum StatusDaProposta
{
  Aberta = 1,
  Inativa = 2,
  Pendente = 3,
  Cancelada = 4
}

Para colocar seus valores em um DropDownlist, ou qualquer controle que suporte a propriedade DataSource, basta usar a rotina abaixo, supondo que estamos um aplicativo ASP.NET:

1
2
3
4
5
if (!Page.IsPostBack)
{
  StatusDropDownList.DataSource = Enum.GetNames(typeof(StatusDaProposta));
  StatusDropDownList.DataBind();
}

O método GetNames da classe Enum retorna um array de strings com os valores de texto utilizados no Enum informado como parâmetro.

Isso já é suficiente para que os valores sejam mostrados no DropDownList. Para recuperar o valor do enum referente ao item selecionado, é preciso refazer a conversão do valor. O método Parse da classe Enum faz o trabalho, convertendo a string para seu valor numérico equivalente ao Enum passado também por parâmetro. Para isso, use o código abaixo:

1
2
3
4
5
6
protected void Button1_Click(object sender, EventArgs e)
{
  StatusDaProposta meuStatus = (StatusDaProposta)Enum.Parse(
    typeof(StatusDaProposta), StatusDropDownList.SelectedValue);
  Label1.Text = meuStatus.ToString();
}

Isso já facilita bantante o trabalho, evitando reescrita de código e também evitando criar estes valores em arquivos separados ou mesmo no banco de dados.

Para saber mais:

http://msdn.microsoft.com/en-us/library/sbbt4032(VS.80).aspx

Fonte: http://aspalliance.com/

Abraços

Tomás Vásquez
www.tomasvasquez.com.br

Diferença entre datas em C#

O que era uma simples tarefa no VB clássico era tirar a diferença entre duas data baseado no conjunto de funções que a linguagem oferecia. Algo parecido pode ser nas linguagens .NET, porém não de forma tão intuitiva. Existem novos objetos e classes (estruturas ou structs no caso do DateTime) que precisam ser conhecidas e utilizadas para conseguir a mesma informação.

O código abaixo mostra um exemplo de como obter tais dados de forma simples utilizando a linguagem C#.

1
2
3
4
5
6
7
8
9
DateTime startTime = DateTime.Now;
 
DateTime endTime = DateTime.Now.AddSeconds( 100 );
 
TimeSpan span = endTime.Subtract ( startTime );
Console.WriteLine( "Time Difference (seconds): " + span.Seconds );
Console.WriteLine( "Time Difference (minutes): " + span.Minutes );
Console.WriteLine( "Time Difference (hours): " + span.Hours );
Console.WriteLine( "Time Difference (days): " + span.Days );

No exemplo acima, foram criados dois objetos DateTime sendo um com a data atual e o outro com 100 segundo a mais do que a data corrente. Basta executar o método Subtract() da struct DateTime para obter um objeto TimeSpan com a diferença de valores entre as duas datas. O objeto TimeSpan representa um intervalo de tempo, ou duração de tempo, medida como um número positivo ou negativo de dias, horas, minutos, segundos e frações de segundo.

Saída:

1
2
3
4
Time Difference (seconds): 40
Time Difference (minutes): 1
Time Difference (hours): 0
Time Difference (days): 0

Como pode ser visto, 100 segundo equivalem a exatos 1 minuto e 40 segundos, que é o resultado exato do código. Outras propriedades como a quantidade de milisegundos poderia ser também avaliadas.

Um descritivo completo da classe TimeSpan pode ser visto no MSDN: http://msdn2.microsoft.com/en-us/library/system.timespan.aspx

Apesar de ser uma abordagem diferenciada, trata-se de uma mecanismo poderoso de tratamento de data e hora no .NET.

Referência: http://www.dotnetspider.com/kb/Article552.aspx