Отображать результаты в виде таблицы в C #

1

Я написал этот метод, который я хотел бы отображать как результат как обычную таблицу (например, имена столбцов, за которыми следуют данные). Мне не удалось найти какой-либо метод для этого. Я также не могу манипулировать WriteLine, чтобы выполнить это. Есть идеи?

Я новичок в программировании и С#.

public void ShowQuery()  //to be used with showing data   
{
    try
    {
        SqlDataReader reader = _mySqlCommand.ExecuteReader(); 
        int columnCount = reader.FieldCount;

        while(reader.Read())  //How can I use display results as a normal table like in access?
        {

            for (int i = 0; i < columnCount; i++)
            {
                Console.WriteLine( reader[i]);

            }//end for 
        }//end while
        reader.Close();
        Console.Beep();
    }
    catch (Exception e)
    {
        Console.WriteLine(e);
    }
}
  • 1
    Лучший ответ: не используйте консольное приложение для этого. Форматирование консоли не является забавой (хотя это возможно с функциями заполнения). Если вы хотите, чтобы он был «как Access», то используйте формы Windows или, что еще лучше, WPF.
  • 0
    Я согласен с Брэдли. Вы также захотите утилизировать SqlDataReader. Stackoverflow.com/questions/16985876/…
Показать ещё 4 комментария
Теги:

3 ответа

0
Лучший ответ

Возможно, что-то вроде этого работает:

private static void OutputTable(string query, bool showHeader)
{
    MySqlConnection conn = GetConn();

    MySqlCommand cmd = conn.CreateCommand();
    cmd.CommandText = query;
    MySqlDataReader reader = cmd.ExecuteReader();
    int columnCount = reader.FieldCount;

    List<List<string>> output = new List<List<string>>();

    if (showHeader)
    {
        List<string> values = new List<string>();
        for (int count = 0; count < columnCount; ++count)
        {
            values.Add(string.Format("{0}", reader.GetName(count)));
        }
        output.Add(values);
    }

    while (reader.Read())
    {
        List<string> values = new List<string>();
        for (int count = 0; count < columnCount; ++count)
        {
            values.Add(string.Format("{0}", reader[count]));
        }
        output.Add(values);
    }
    reader.Close();

    List<int> widths = new List<int>();
    for (int count = 0; count < columnCount; ++count)
    {
        widths.Add(0);
    }

    foreach (List<string> row in output)
    {
        for (int count = 0; count < columnCount; ++count)
        {
            widths[count] = Math.Max(widths[count], row[count].Length);
        }
    }

    //int totalWidth = widths.Sum() + (widths.Count * 1) * 3;
    //Console.SetWindowSize(Math.Max(Console.WindowWidth, totalWidth), Console.WindowHeight);

    foreach (List<string> row in output)
    {
        StringBuilder outputLine = new StringBuilder();

        for (int count = 0; count < columnCount; ++count)
        {
            if (count > 0)
            {
                outputLine.Append(" ");
            }
            else
            {
                outputLine.Append("| ");
            }
            string value = row[count];
            outputLine.Append(value.PadLeft(widths[count]));
            outputLine.Append(" |");
        }

        Console.WriteLine("{0}", outputLine.ToString());
    }
}
  • 0
    Он работает, хотя не уверен, что я действительно понимаю код, но также не нуждался в объявлении журнала и не был распознан. Я полагаю, что если я прочитаю строковый класс, я лучше пойму это?
  • 0
    Извините за объявление журнала, я удалил его. Причина, по которой таблицу трудно вывести, состоит в том, что вам нужно знать максимальную ширину всех значений в каждом столбце. Затем, когда вы выводите каждое значение, вы убедитесь, что оно содержит столько символов. Итак, для этого я сохраняю весь вывод в список .. списков строк. (Это двумерный массив строк.)
1

Если вы хотите прочитать из базы данных SQL и показать данные в виде сетки, я бы рекомендовал использовать ORM, например, Entity Framework или Linq to SQL. Это облегчает вам всю процедуру. Но если вы не можете, возможно, из-за требования, вам нужно создать модель для вашей таблицы:

public class MyTableModel{
    public int Id {get; set;}
    public String value {get; set;}
}

Теперь, используя обычные запросы:

con.Open();
List<MyTableModel> DataBind = new List<MyTableModel>();
cmd.CommandText = "SELECT Id, value FROM MyTable";
_DataReader = cmd.ExecuteReader();
if(_DataReader.HasRows) {
   while(_DataReader.Read()){
      DataBind.Add(new MyTableModel() {Id = _DataReader.GetInt(0), value =_DataReader.GetString(1) });
   }
}
con.Close();

Теперь с помощью GridView (для GUI):

DatGrid DG = new DataGrid();
DG.Columns.Add("Id");
DG.Columns.Add("value");
DG.ItemSource = DataBind;

Или для консольного приложения, используя:

foreach(var i in DataBind){
    Console.WriteLine("{0}\t{1}", i.Id, i.value);
}
  • 1
    Мне придется изучить код, поэтому я понимаю это. Я постараюсь реализовать это так
1

Несколько вещей, которые вы должны изучить:

  • String.PadRight, String.PadLeft, позволяют добавлять пробелы, пока ваша строка не будет иметь определенную длину.

  • форматирование строк, позволяют вам легче форматировать строки. обратите внимание, что вы можете использовать Console.WriteLine же, как и String.Format

здесь образец

var s1 = "1983bi".PadLeft(10);
var s2 = "23".PadLeft(10);

Console.WriteLine("{0} | {1}", s1, s2);
Console.WriteLine("{0} | {1}", s2, s1);

Console.ReadKey(false);
  • 0
    что означает скобка {} в этом контексте? Допустим, у меня есть 4 столбца в моей конкретной таблице данных, мне нужно для них?
  • 1
    @ Altaf фигурная скобка для строк формата, и они в значительной степени заполнители для значений, которые вы передаете после строки. {0} будет заменен первым передаваемым параметром, {1} будет заменен следующим, {2} будет заменен следующим, и так далее.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню