【问题标题】:Can't figure out why my results are appearing with ListBox{"name"}无法弄清楚为什么我的结果与 ListBox{"name"} 一起出现
【发布时间】:2014-05-14 22:45:24
【问题描述】:
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 但是当它被显示到用户界面时,它显示为

"ListViewItem {"name..."}"

而不是

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

【问题讨论】:

    标签: c# winforms listbox checkedlistbox


    【解决方案1】:

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

    checkedListBox1.Items.Add(lvi, true);
    

    它隐式调用lvi.ToString(),它正在显示类的名称。


    试试这个:

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

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

    MultiColumn = false:

    MultiColumn = true:

    您也许可以通过使用选项卡来实现准表格布局,但如果某些字符串比其他字符串长得多,它可能看起来很有趣。

    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, ' ')));
    

    【讨论】:

    • 对不起。垂直分隔符应该代表我的列表框中的一个新列。我做了checkedListBox1.Items.Add(lvi, true);因为它将复选框设置为选中或未选中(基于数据库中的值。
    • 我更新了我的代码为 checkedListBox1.Items.Add(lvi.SubItems.Cast().Select(x => x.Text), false);现在我得到 System.Linq.Enumeration
    猜你喜欢
    • 2023-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多