c#
  • winforms
  • listview
  • 2013-12-17 42 views 0 likes 
    0

    例如,我有一个测验记录。我想要显示所有测验以及接受测验的学生。如果测验的总数是20,那么列表视图会动态地向列表视图添加另一列。我怎样才能做到这一点?另外,我希望列表视图的第一列显示学生的姓名。如何动态设置列表视图中的列数?

    这是我如何手动将项目添加到列。

    listView1.Items.Clear(); 
    conek.OPEN("Select * from thesisdb.teachers where username='"+txts+"'"); 
    while(conek.reader.Read()){ 
         ListViewItem ni = new ListViewItem(conek.reader[0].ToString()); 
         ni.SubItems.Add(conek.reader[1].ToString()); 
         ni.SubItems.Add(conek.reader[2].ToString()); 
         ni.SubItems.Add(conek.reader[3].ToString()); 
         ni.SubItems.Add(conek.reader[4].ToString()); 
         ni.SubItems.Add(conek.reader[5].ToString()); 
         ni.SubItems.Add(conek.reader[6].ToString()); 
         ni.SubItems.Add(conek.reader[7].ToString()); 
         ni.SubItems.Add(conek.reader[8].ToString()); 
         ni.SubItems.Add(conek.reader[9].ToString()); 
         listView1.Items.AddRange(new ListViewItem[] { ni }); 
    } 
    conek.CLOSE(); 
    

    我尝试使用for循环的读者数量的项目,但它似乎并没有工作。

    这个类是由我们的教师给出的,这是我们自从我们开始使用c#以来一直使用的。

    namespace spms.classes 
    { 
    public class clsOpenCon 
    { 
        public static string connectionAddress = "uid=root; database=thesisdb;"; 
        public static MySqlConnection CN = new MySqlConnection(classes.clsOpenCon.connectionAddress); 
    
        public MySqlCommand Com = new MySqlCommand(); 
        public MySqlDataReader reader; 
    
        public void nonQuery(string cmdText) 
        { 
        Com.Connection = CN; 
        CN.Open(); 
        Com.CommandText = cmdText; 
        Com.ExecuteNonQuery(); 
        Com.Dispose(); 
        CN.Close(); 
        } 
        public void OPEN(string cmdtext) 
        { 
        Com.Connection = classes.clsOpenCon.CN; 
        classes.clsOpenCon.CN.Open(); 
        Com.CommandText = cmdtext; 
        reader = Com.ExecuteReader(); 
        } 
        public void CLOSE() 
        { 
        reader.Close(); 
        Com.Dispose(); 
        classes.clsOpenCon.CN.Close(); 
        } 
        } 
        } 
    

    回答

    2

    你可能会发现它更容易使用DataGridView并使用DataTable自动填充它,像这样:

    dataGridView.DataSource = conek.ExecuteQuery("Select * from thesisdb.teachers where username='"+txts+"'"); 
    

    哪里的executeQuery看起来是这样的:

    internal DataTable ExecuteQuery(string query) 
    { 
        DataTable table = new DataTable(); 
    
        var refDataAdapter = new MySqlDataAdapter(new MySqlCommand(query, SqlConn)); 
        refDataAdapter.Fill(table); 
    
        return table; 
    } 
    

    但要回答你的问题,你需要在添加项目之前通过调用 listview1.Columns.Add来自己添加列。

    除了您的问题,您不应该将文本粘贴到您的查询中,如txts,而是使用parameters来避免SQL注入攻击。

    +0

    我还是很新的c#和我以前没有使用过datagridview。添加子项和项目范围的逻辑与列表视图相同吗? –

    +0

    datagridview将为您完成所有工作 - 您所做的只是将它传递给DataTable--我已经放入了我的答案中的那一行确实是您所需要的!它会得到列名并为你添加它们。您可能需要在GUI设计器中设置一些格式以使其看起来像您想要的 - 您可以使它们看起来很像列表视图。 如果你想手动做到最好坚持用listview可能 - datagridview是最好的自动方式! – noelicus

    +0

    所以我只需要创建一个数据表,我应该写下我的sql语句,然后使用datagridview的数据表来显示数据? –

    相关问题