2016-11-23 187 views
-2

我使用了一个名为print_base()函数来设置从结构数组所有元素在ListView的每个字段:显示ListView中数据WINAPI

void print_base(int number_of_students) { 
    int test_value = 3; 
    int exam_value= 4; 

    for (int i = 0; i < number_of_students; i++) { 
     for (int j = 0; j <= 8; j++) { 
      switch(j){ 
       case 0: 
        char buffer_ID[50]; 
        sprintf (buffer_ID, "%d ",student[i].ID); 
        ListView_InsertItem(grade_list, &lvi); 
        lvi.pszText = buffer_ID; 
        lvi.iItem = i; 
        lvi.iSubItem = 0; 
        break; 
       case 1: 
        ListView_SetItemText(grade_list, i, j, student[i].name); 
        break; 
       case 2: 
        ListView_SetItemText(grade_list, i, j,student[i].surname); 
        break; 
       case 3: 
        char buffer_mark1 [50]; 
        sprintf (buffer_mark1 , "%d ",student[i].mark_1); 
        ListView_SetItemText(grade_list, i, j, buffer_mark1); 
        break; 
       case 4: 
        char buffer_mark2 [50]; 
        sprintf (buffer_mark2 , "%d ",student[i].mark_2); 
        ListView_SetItemText(grade_list, i, j,buffer_mark2); 
        break; 
       case 5: 
        char buffer_mark3 [50]; 
        sprintf (buffer_mark3 , "%d ",student[i].mark_3); 
        ListView_SetItemText(grade_list, i, j, buffer_mark3); 
        break; 
       case 6: 
        char buffer_mark4 [50]; 
        sprintf (buffer_mark4 , "%d ",student[i].mark_4); 
        ListView_SetItemText(grade_list, i, j,buffer_mark4); 
        break; 
       case 7: 
        student[i].avarage=((((float)student[i].mark_1*test_value)+(student[i].mark_2*test_value)+(student[i].mark_3*test_value)+(student[i].mark_4*exam_value))/14); 
        char buffer_avarage[50]; 
        sprintf (buffer_avarage, "%.2f ",student[i].avarage); 
        ListView_SetItemText(grade_list, i, j, buffer_avarage); 
        break; 
      } 
     } 
    } 
} 

我不知道为什么,但你可以看到在下面的图片中,只有最后一条记录几乎正确显示(没有ID)。是没有看到avarage因为ListView的扩展:

image

我觉得可能是一个问题ListView_InsertItem(),但我不知道什么是错的究竟。

谁能告诉我为什么会发生这种情况,以及如何解决它?

此外,我想知道是否有任何可能性编辑和保存在ListView中完成的更改(双击并编辑一个字段或其他东西)。

+1

在*调用'ListView_InsertItem'之前,您没有尝试初始化'lvi' *,但在*之后没有*!有时这有帮助。这是重点。 – RbMm

+0

不是这种情况。我尝试了两种选择。 LVITEM lvi; lvi.mask = LVIF_TEXT; print_base(amount_of_students); – eredin

回答

0

您需要在外部循环的每次迭代重新初始化LVITEM,你需要调用ListView_InsertItem()之前初始化其字段

而且根本不需要使用内部循环,那只是浪费编码。

尝试一些更喜欢这个:

void print_base(int number_of_students) 
{ 
    int test_value = 3; 
    int exam_value = 4; 

    LVITEM lvi; 
    char buffer[50]; 

    for (int i = 0; i < number_of_students; ++i) 
    { 
     memset(&lvi, 0, sizeof(lvi)); 
     lvi.mask = LVIF_TEXT; 
     lvi.iItem = i; 
     lvi.iSubItem = 0; 
     lvi.pszText = buffer; 

     sprintf(buffer, "%d", student[i].ID); 
     ListView_InsertItem(grade_list, &lvi); 

     ListView_SetItemText(grade_list, i, 1, student[i].name); 
     ListView_SetItemText(grade_list, i, 2, student[i].surname); 

     sprintf(buffer, "%d", student[i].mark_1); 
     ListView_SetItemText(grade_list, i, 3, buffer); 

     sprintf(buffer, "%d", student[i].mark_2); 
     ListView_SetItemText(grade_list, i, 4, buffer); 

     sprintf(buffer, "%d", student[i].mark_3); 
     ListView_SetItemText(grade_list, i, 5, buffer); 

     sprintf(buffer, "%d", student[i].mark_4); 
     ListView_SetItemText(grade_list, i, 6, buffer); 

     student[i].average = ((((float)student[i].mark_1 * test_value) + (student[i].mark_2 * test_value) + (student[i].mark_3 * test_value) + (student[i].mark_4 * exam_value))/14); 

     sprintf(buffer, "%.2f", student[i].avarage); 
     ListView_SetItemText(grade_list, i, 7, buffer); 
    } 
} 

至于编辑,ListView控件只支持编辑第一列(见LVS_EDITLABELS窗口样式和ListView_EditLabel()窗口消息)。编辑完成后,ListView将向其父窗口发送一个LVN_ENDLABELEDIT通知,其中包含项目索引和新文本,然后您可以将其复制到student[]阵列中。

如果要允许编辑其他列值,最好使用其他UI,例如EDIT控件和保存BUTTON。当用户点击ListView项目时,可以将所需的列文本复制到EDIT控件中,并且单击该按钮时,将新文本复制回阵列并相应地更新ListVew。

+0

*“您需要在外循环的每次迭代中重新初始化LVITEM”* - 或者,将其放置在循环内部:'LVITEM lvi = {0};'。在更广泛的范围内声明一个变量比指定的生命期没有实际的理由。 – IInspectable