Чтение из указанного c места в c# - PullRequest
0 голосов
/ 07 августа 2020

Привет, я хочу знать, могу ли я поместить console.readline в определенное c место.

Я пробую это:

Console.Writeline("Type a number: ");
Console.SetCursorPosition(x,y)
int opcion = int.parse(Console.ReadLine());

Но перед этим кодом у меня есть foreach, который считывает объекты в списке

foreach (var producto in productos)
{
    Console.WriteLine($"\n\tID: {producto.id_producto} || Categoria: {producto.Categoria} || 
                              Producto: {producto.Producto} || Precio: {producto.Precio}");
}

Поэтому я не могу использовать SetCursosPosition (x, y), потому что если я добавляю объекты в свой список, то '(x, y)' должен быть

Я хочу знать, можно ли поместить установленный Console.ReadLine в определенную c позицию.

Код:

foreach (var producto in productos)
            {
                Console.WriteLine($"\n\tID: {producto.id_producto} || Categoria: {producto.Categoria} || Producto: {producto.Producto} || Precio: {producto.Precio}");

            }
            Console.WriteLine("\n\nIngrese el ID del Producto que desea comprar: ");
            Console.SetCursorPosition(46, 10);
            int Numero_producto = int.Parse(Console.ReadLine());

Изображение, где SetCursor верен с 4 объектами в списке

Изображение, где SetCursor неверен, потому что я добавляю объект в список

Ответы [ 2 ]

0 голосов
/ 07 августа 2020

На «неправильном» изображении мы видим, что курсор находится над подсказкой на пару строк. Мой первый вопрос: почему вы пытаетесь явно установить позицию этого приглашения?

Просто выведите приглашение и оставьте курсор на месте.

Изменить:

Console.WriteLine("\n\nIngrese el ID del Producto que desea comprar: ");
Console.SetCursorPosition(46, 10);
int Numero_producto = int.Parse(Console.ReadLine());

Кому:

Console.Write("\n\nIngrese el ID del Producto que desea comprar: ");
int Numero_producto = int.Parse(Console.ReadLine());

Обратите внимание, что WriteLine() был изменен на Write(), и мы НЕ вызываем SetCursorPosition() вообще, оставляя курсор сразу после приглашения, где вы должны ожидайте ввода.

0 голосов
/ 07 августа 2020

Как прокомментировали другие, просто отслеживайте позицию курсора, когда вы пишете свои данные. Не забудьте учесть символы новой строки (\ n) в ваших строках.

См. Комментарии в коде ...

// create test data
IList<Product> products = new List<Product>()
{
    new Product(){ ProductId = 1, Category = "Cat 1", Price = 1.99m, ProductName = "Item 001"},
    new Product(){ ProductId = 2, Category = "Cat 1", Price = 2.99m, ProductName = "Item 002"},
    new Product(){ ProductId = 3, Category = "Cat 2", Price = 3.99m, ProductName = "Item 003"},
    new Product(){ ProductId = 4, Category = "Cat 2", Price = 4.99m, ProductName = "Item 004"},
};

// initialize row/column positions at start
int origColumn = Console.CursorLeft;
int origRow = Console.CursorTop;
int currentColumn = origColumn;
int currentRow = origRow;

// write items to console and keep track of currentRow
foreach (var p in products)
{
    Console.WriteLine($"\n\tProductId: {p.ProductId} || Category: {p.Category} || ProductName: {p.ProductName} || Price: {p.Price}");
    // add 2; one for each line written and one for each new line character (\n)
    currentRow = currentRow + 2;
}

// request input from user and loop request until int type is received
// or user enters 'q' or 'Q' to quit
int selectedProductId = 0;
string inputValue = string.Empty;
do
{
    string text = "Type a number ('Q' exit) > ";
    Console.WriteLine(text);
    currentColumn = text.Length; // set column from text length
    Console.SetCursorPosition(currentColumn, currentRow);
    inputValue = Console.ReadLine();
    int.TryParse(inputValue, out selectedProductId);
    currentRow++;
} while (selectedProductId == 0 && !inputValue.Equals("q", StringComparison.InvariantCultureIgnoreCase));

// write selected product detail to console
Product selectedProduct = products.FirstOrDefault(p => p.ProductId == selectedProductId);
if (selectedProduct != null)
{
    Console.WriteLine("\nSelected Product Detail:");
    Console.WriteLine($"ProductId: {selectedProduct.ProductId} || Category: {selectedProduct.Category} || ProductName: {selectedProduct.ProductName} || Price: {selectedProduct.Price}");
}
else if(!inputValue.Equals("q", StringComparison.InvariantCultureIgnoreCase))
{
    Console.WriteLine("Unable to locate that product Id.");
}
Console.WriteLine("\nDone.");
...