Pregunta

Necesito imprimir una cadena en un cuadro de mensaje en el formato específico para el que estoy usando un código similar a como se muestra a continuación:

string text=""; 
for (int i=0; i<n; i++)
{
   a=..
   b=..
   c=..
   text += String.Format("{0, -8} {1,-4} {2,8}", a, b, c);
}
MessageBox.Show(text);

Así que para siguiente conjunto de valores:

XYZ,ABC,100

X,ABC,100

consigo siguiente resultado:

XYZ     ABC     100

X     ABC     100

Así se puede ver la segunda línea no está bien formateado. Probablemente esto está sucediendo porque estoy imprimiendo en este cuadro de mensaje. El espacio de un carácter y un 'espacio' que toma es diferente. Cualquier solución para esto?

¿Fue útil?

Solución

Trate de usar un \t para insertar las pestañas entre los valores.

Otros consejos

Esto no funciona porque de mensaje utiliza una fuente de espaciado proporcional, la letra M es mucho más amplia que la letra l. Al igual que es en este mensaje a su ahora está leyendo. Sólo se puede esperar que la alineación como esto funcione si se muestra con una fuente de paso fijo. Cambiar la fuente cuadro de mensaje no es el caso, se trata de un ajuste del sistema.

Se puede conseguir algo mejor mediante el uso de pestañas:

text += String.Format("{0}\t{1}\t{2}", a, b, c);

pero no es infalible si el tamaño del campo se acerca al tamaño de la pestaña. Utilice un ListView con vistas = Detalles su lugar.

No está seguro de si es realmente lo que quieres decir, pero utiliza una monospaced fuente como " Courier New ". Si ya lo hizo, entonces lo siento para esta respuesta obvia.

No importa: no es posible con el cuadro de mensaje estándar accoding a este hilo . Tal vez entonces una opción es crear su propia clase de mensaje.

Una prueba creada en ventanas de aplicación con el siguiente código:

    public void Test1()
    {
        List<List<String>> list = new List<List<string>>() { 
            new List<String>() { "XYZ", "ABC","100" },
            new List<String>() { "X", "ABC", "100"},
        };

        string text = "", a = "", b = "", c = "";
        for (int i = 0; i < list.Count; i++)
        {
            a = list[i][0];
            b = list[i][1];
            c = list[i][2];
            text += String.Format("{0, -8} {1,-4} {2,8}{3}", a, b, c, Environment.NewLine);
        }
        MessageBox.Show(text);
    }

hace lo que dijiste, pero después de comprobar que con la aplicación de consola con el siguiente código:

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Test1();
            Console.ReadKey();
        }

        public static void Test1()
        {
            List<List<String>> list = new List<List<string>>() { 
                new List<String>() { "XYZ", "ABC","100" },
                new List<String>() { "X", "ABC", "100"},
            };

            string text = "", a = "", b = "", c = "";
            for (int i = 0; i < list.Count; i++)
            {
                a = list[i][0];
                b = list[i][1];
                c = list[i][2];
                text += String.Format("{0, -8} {1,-4} {2,8}{3}", a, b, c, Environment.NewLine);
            }
            Console.WriteLine(text);
        }
    }
}

Se hace lo que se puede esperar.

Por lo tanto, lo que las pruebas sugieren es que si está haciendo lo que se supone que debe hacer, pero con la misma falta de fuente de ancho en el MessageBox, que no se alinea correctamente. Pero, por otro lado, con la aplicación de consola utilizando las mismas fuentes de ancho, que hace exactamente alineadas.

La clase de mensaje, ya sea de las Formas o WPF, es sólo un envoltorio alrededor del cuadro de mensaje Win32, por lo que un programador no es capaz de (fácilmente) hacer cosas como cambiar la fuente a una fuente de paso fijo por lo que todas las líneas de caracteres muy bien con el formato de cadenas.

Se podría, sin embargo, hacer su propio clon del cuadro de mensaje utilizando un formulario y una etiqueta (y lo botones que necesita), entonces lo muestra usando el método ShowDialog ().

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top