[C#] Comprobar contenido de textBox

Iniciado por DeMoNcRaZy, 10 Septiembre 2015, 11:27 AM

0 Miembros y 1 Visitante están viendo este tema.

DeMoNcRaZy

Buenas,

Tengo un problema para verificar si un campo está textBox está en blanco.. si lo esta mandar una alerta y si no seguir con el procedimiento que es crear un directorio.

Código (csharp) [Seleccionar]
string path = @"C:\" + textBox1.Text;

            if(textBox1.Text == null)
            {
                MessageBox.Show("Debe asignar un nombre.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Stop);
            }
            else
            {
                try
                {
                    // Comprobamos si existe el directorio
                    if (Directory.Exists(path))
                    {
                        MessageBox.Show("La carpeta ya parece existir.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                    }

                    // Creamos el directorio
                    DirectoryInfo di = Directory.CreateDirectory(path);
                    MessageBox.Show("Se ha creado una carpeta: " + Directory.GetCreationTime(path), "Exito", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                catch (Exception)
                {
                    MessageBox.Show("Se ha producido un error.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                }
            }


Tengo esto, y cuando presiono el botón para crear.. me dice que el directorio ya existe, y luego otro mensaje de que se ha creado.. y no se ha creado nada.

Funciona bien hasta que le he añadido el if para comprobar que el textBox no estuviese en blanco.

¿Saben algo como podría arreglarlo?

Cualquier información adicional la agradecería.

Saludos.
Esta página web no está disponible - Google Chrome

Eleкtro

#1
1. No utilizar nombres de variables cómo path que puedan entrar en conflicto con nombres de namespaces, classes (System.IO.Path) u otros miembros built-in.

2. Referencia el texto del control TextBox1, ya que lo usas más de una vez.

3. También deberías comprobar, antes de intentar crear el directorio, si la ruta/nombre de directorio contiene caracteres ilegales, con la función System.IO.Path.GetInvalidFileNameChars o System.IO.Path.GetInvalidPathChars dependiendo de si es un nombre de carpeta o una ruta completa.

4. La variable di no la usas para nada, dale uso para evitar la siguiente llamada a Directory.GetCreationTime.

Un ejemplo:

Código (vbnet) [Seleccionar]
Dim text As String = TextBox1.Text
Dim dirPath As String = Path.Combine("C:\", text)

If String.IsNullOrEmpty(text) Then
   MessageBox.Show("Debe asignar un nombre de directorio.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Stop)

ElseIf Path.GetInvalidFileNameChars.Any(Function(c) text.Contains(c)) Then
   MessageBox.Show("El nombre de directorio contiene caracteres ilegales.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Stop)

ElseIf Directory.Exists(dirPath) Then
   MessageBox.Show("El directorio ya existe.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Stop)

Else
   Dim di As DirectoryInfo = Directory.CreateDirectory(dirPath)
   MessageBox.Show(String.Format("Se ha creado una carpeta: {0}", di.CreationTime.ToString),
                   "Éxito", MessageBoxButtons.OK, MessageBoxIcon.Information)

End If


Traducción online a C#:
Código (csharp) [Seleccionar]
string text = TextBox1.Text;
string dirPath = Path.Combine("C:\\", text);

if (string.IsNullOrEmpty(text)) {
MessageBox.Show("Debe asignar un nombre de directorio.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Stop);

} else if (Path.GetInvalidFileNameChars.Any(c => text.Contains(c)) {
MessageBox.Show("El nombre de directorio contiene caracteres ilegales.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Stop);

} else if (Directory.Exists(dirPath)) {
MessageBox.Show("El directorio ya existe.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Stop);

} else {
DirectoryInfo di = Directory.CreateDirectory(dirPath);
MessageBox.Show(string.Format("Se ha creado una carpeta: {0}", di.CreationTime.ToString), "Éxito", MessageBoxButtons.OK, MessageBoxIcon.Information);

}

//=======================================================
//Service provided by Telerik (www.telerik.com)
//=======================================================





De todas formas para tratar temas de validación de datos introducidos en los campos de un control, lo apto graficamente hablando sería utilizar un proveedor de errores (ErrorProvider).



Ejemplo en VB.Net (el de la imagen GIF)
Código (vbnet) [Seleccionar]
Imports System.IO

Public NotInheritable Class Form1 : Inherits Form

   Private ReadOnly Property DirectoryPath As String
       Get
           Return String.Format("C:\{0}", TextBox1.Text) ' o Path.Combine("C:\", TextBox1.Text)
       End Get
   End Property

   Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) _
   Handles TextBox1.TextChanged, TextBox1.Enter

       Dim tb As TextBox = DirectCast(sender, TextBox)

       If String.IsNullOrEmpty(tb.Text) Then
           Me.ErrorProvider1.SetError(tb, "Debe asignar un nombre de directorio.")

       ElseIf Path.GetInvalidFileNameChars.Any(Function(c) tb.Text.Contains(c)) Then
           Me.ErrorProvider1.SetError(tb, "El nombre de directorio contiene caracteres ilegales.")

       ElseIf Directory.Exists(Me.DirectoryPath) Then
           Me.ErrorProvider1.SetError(tb, "El directorio ya existe.")

       Else
           ' Eliminar error.
           Me.ErrorProvider1.SetError(tb, String.Empty)

       End If

       Label1.Text = Me.ErrorProvider1.GetError(tb)
       Button1.Enabled = String.IsNullOrEmpty(Label1.Text)

   End Sub

   Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

       Dim di As DirectoryInfo = Directory.CreateDirectory(Me.DirectoryPath)
           MessageBox.Show(String.Format("Se ha creado una carpeta: {0}", di.CreationTime.ToString),
                           "Éxito", MessageBoxButtons.OK, MessageBoxIcon.Information)

   End Sub

End Class


Traducción online a C#:
Código (csharp) [Seleccionar]
using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.IO;

public sealed class Form1 : Form
{

private string DirectoryPath {
// o Path.Combine("C:\", TextBox1.Text)
get { return string.Format("C:\\{0}", TextBox1.Text); }
}


private void TextBox1_TextChanged(object sender, EventArgs e)
{
TextBox tb = (TextBox)sender;

if (string.IsNullOrEmpty(tb.Text)) {
this.ErrorProvider1.SetError(tb, "Debe asignar un nombre de directorio.");

} else if (Path.GetInvalidFileNameChars.Any(c => tb.Text.Contains(c))) {
this.ErrorProvider1.SetError(tb, "El nombre de directorio contiene caracteres ilegales.");

} else if (Directory.Exists(this.DirectoryPath)) {
this.ErrorProvider1.SetError(tb, "El directorio ya existe.");

} else {
// Eliminar error.
this.ErrorProvider1.SetError(tb, string.Empty);

}

Label1.Text = this.ErrorProvider1.GetError(tb);
Button1.Enabled = string.IsNullOrEmpty(Label1.Text);

}


private void Button1_Click(object sender, EventArgs e)
{
DirectoryInfo di = Directory.CreateDirectory(this.DirectoryPath);
MessageBox.Show(string.Format("Se ha creado una carpeta: {0}", di.CreationTime.ToString), "Éxito", MessageBoxButtons.OK, MessageBoxIcon.Information);

}

}

//=======================================================
//Service provided by Telerik (www.telerik.com)
//=======================================================








DeMoNcRaZy

Muchas gracias. Excelente explicación  ;)

Además me ha encantado la segunda opción de bloquear el botón, y además mandar errores sin un Message.Show.

Gracias de nuevo.

Saludos.
Esta página web no está disponible - Google Chrome