使用 PadLeft 函数在 C# 中同样概述列表框值
Equally outlining listbox values in C# with the PadLeft function
我在处理列表框和列表框中的值已经有一段时间了,我偶然发现了另一个问题。
我正在从我的 Access 数据库中获取数据(字段名称和值)并将它们显示在列表框中。我试图在等距的字段名称右侧勾勒出字段名称的值(因此它们都在彼此下方)。我正在尝试为此使用 PadLeft 函数,但出于某种原因,这并没有在彼此下方概述它们。我认为这与字段名称的长度有关。
我用这行代码得到的结果:
try
{
connection.Open();
OleDbCommand command = new OleDbCommand();
command.Connection = connection;
string query = "select * from Sparen WHERE Id=1";
command.CommandText = query;
OleDbDataReader reader = command.ExecuteReader();
var columns2 = listBox6;
while (reader.Read())
{
for (int i = 0; i < reader.FieldCount; i++)
{
columns2.Items.Add(reader.GetName(i) + reader.GetValue(i).ToString().PadLeft(15));
}
}
connection.Close();
}
这是:
正如您所看到的,值的轮廓并没有在彼此下方。似乎字段名称长度会影响填充计数。
所以我想我可以通过像这样用字段名称的长度减去填充来解决这个问题:
try
{
connection.Open();
OleDbCommand command = new OleDbCommand();
command.Connection = connection;
string query = "select * from Sparen WHERE Id=1";
command.CommandText = query;
OleDbDataReader reader = command.ExecuteReader();
int x;
var columns2 = listBox6;
while (reader.Read())
{
for (int i = 0; i < reader.FieldCount; i++)
{
x = reader.GetName(i).Length;
columns2.Items.Add(reader.GetName(i) + reader.GetValue(i).ToString().PadLeft(15 - x));
}
}
connection.Close();
}
catch (Exception ex)
{
MessageBox.Show("Error" + ex);
}
结果如下:
如您所见,新代码对大纲差异产生了一些影响,但它仍然没有达到预期的效果。轮廓仍然不相等(彼此下方)。有人知道这里出了什么问题吗?
要解决您眼前的问题,只需在列表框中使用 fixed-width 字体:
listBox1.Font = new Font(FontFamily.GenericMonospace, listBox1.Font.Size);
现在您的填充逻辑将按预期工作:
考虑一下 Hans 的观点;检查已经显示多列数据的控件,例如 ListView 或 DataGridView。
您遇到的问题是由于字体不是 "fixed width",所以有些字符比其他字符宽。
列表框控件并非真正设计用于显示多列,而这正是您在这里寻找的。我建议您改用 System.Windows.Forms.DataGridView
。
我在处理列表框和列表框中的值已经有一段时间了,我偶然发现了另一个问题。
我正在从我的 Access 数据库中获取数据(字段名称和值)并将它们显示在列表框中。我试图在等距的字段名称右侧勾勒出字段名称的值(因此它们都在彼此下方)。我正在尝试为此使用 PadLeft 函数,但出于某种原因,这并没有在彼此下方概述它们。我认为这与字段名称的长度有关。
我用这行代码得到的结果:
try
{
connection.Open();
OleDbCommand command = new OleDbCommand();
command.Connection = connection;
string query = "select * from Sparen WHERE Id=1";
command.CommandText = query;
OleDbDataReader reader = command.ExecuteReader();
var columns2 = listBox6;
while (reader.Read())
{
for (int i = 0; i < reader.FieldCount; i++)
{
columns2.Items.Add(reader.GetName(i) + reader.GetValue(i).ToString().PadLeft(15));
}
}
connection.Close();
}
这是:
正如您所看到的,值的轮廓并没有在彼此下方。似乎字段名称长度会影响填充计数。
所以我想我可以通过像这样用字段名称的长度减去填充来解决这个问题:
try
{
connection.Open();
OleDbCommand command = new OleDbCommand();
command.Connection = connection;
string query = "select * from Sparen WHERE Id=1";
command.CommandText = query;
OleDbDataReader reader = command.ExecuteReader();
int x;
var columns2 = listBox6;
while (reader.Read())
{
for (int i = 0; i < reader.FieldCount; i++)
{
x = reader.GetName(i).Length;
columns2.Items.Add(reader.GetName(i) + reader.GetValue(i).ToString().PadLeft(15 - x));
}
}
connection.Close();
}
catch (Exception ex)
{
MessageBox.Show("Error" + ex);
}
结果如下:
如您所见,新代码对大纲差异产生了一些影响,但它仍然没有达到预期的效果。轮廓仍然不相等(彼此下方)。有人知道这里出了什么问题吗?
要解决您眼前的问题,只需在列表框中使用 fixed-width 字体:
listBox1.Font = new Font(FontFamily.GenericMonospace, listBox1.Font.Size);
现在您的填充逻辑将按预期工作:
考虑一下 Hans 的观点;检查已经显示多列数据的控件,例如 ListView 或 DataGridView。
您遇到的问题是由于字体不是 "fixed width",所以有些字符比其他字符宽。
列表框控件并非真正设计用于显示多列,而这正是您在这里寻找的。我建议您改用 System.Windows.Forms.DataGridView
。