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.
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.
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:
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#:
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).
(http://i.imgur.com/fprw3eh.gif)
Ejemplo en VB.Net (el de la imagen GIF)
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#:
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)
//=======================================================
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.