无法弄清楚为什么我的结果会出现在ListBox中{" name"}

时间:2014-05-14 22:45:25

标签: c# winforms listbox checkedlistbox

public void loadAllEmployeesFromSQLServer()
{
    SqlConnection conn = new SqlConnection();
    SqlCommand cmd = new SqlCommand();
    conn.ConnectionString = "Server=WIN2008SERVER;Database=Kiosk;Uid=kiosk;Pwd=kiosk;";
    conn.Open();
    string query = "SELECT [displayName],[activeDirectoryName],[roleID],[activeAccount] FROM [ProbationKiosk].[dbo].[Employees]";


    cmd.Connection = conn;
    cmd.CommandText = query;

    SqlDataReader dr = cmd.ExecuteReader();
    ArrayList allEmployees = new ArrayList();
    while (dr.Read())
    {
        employees emp = new employees(dr["displayName"].ToString(), dr["activeDirectoryName"].ToString(), dr["roleID"].ToString(), Int32.Parse(dr["activeAccount"].ToString()));
        allEmployees.Add(emp);

        string[] employeeData = new string[3];
        employeeData[0] = emp.commonName;
        employeeData[1] = emp.activeDirectory;
        employeeData[2] = emp.currentRole;
        ListViewItem lvi = new ListViewItem(employeeData);
        if (emp.isActive == 1)
        {
            checkedListBox1.Items.Add(lvi, true);
        }
        else
        {
            checkedListBox1.Items.Add(lvi, false);
        }

    }
}

我将CheckedListBox作为多列表。

我调试了我的代码,我将数据存储到ListViewItem 但是当它显示在UI上时,它显示为

"ListViewItem {"name..."}"

而不是

"[ ]     |   First Name Last Name  |    active directory name   | roleID"

1 个答案:

答案 0 :(得分:0)

您看到了这一点,因为当您执行以下行时:

checkedListBox1.Items.Add(lvi, true);

它隐含地调用了lvi.ToString(),它显示了该类的名称。


请改为尝试:

checkedListBox1.Items.Add(string.Join(" | ",
    lvi.SubItems.Cast<ListViewItem.ListViewSubItem>().Select(x => x.Text)));

另外,我假设您将MultiColumn上的CheckedListBox属性设置为true。这并没有很好地格式化,就像在网格中一样。它只是确定项目是在单个列中显示还是在空间允许时流入多个列。

MultiColumn = false

enter image description here

MultiColumn = true

enter image description here

您可以通过使用制表符来获得准表格布局,但如果某些字符串比其他字符串长得多,则可能看起来很有趣。

checkedListBox1.Items.Add(string.Join("\t",
    lvi.SubItems.Cast<ListViewItem.ListViewSubItem>().Select(x => x.Text)));

你可以通过找到最长的可能字符串并相应地填充Text属性来解决这个问题:

checkedListBox1.Items.Add(string.Join("",
    lvi.SubItems.Cast<ListViewItem.ListViewSubItem>()
                .Select(x => x.Text.Padding(20, ' ')));