2011-08-09 4 views
0

J'ai un listview qui affiche le contenu de la base de données.J'ai également un bouton d'actualisation dans mon formulaire.Une fois le bouton d'actualisation est cliqué, la liste est mise à jour une fois de plus.Le problème est lorsque l'actualisation bouton est cliqué l'élément déjà sélectionné dans le listview est supprimeront du focus.This est mon codeC# Affichage liste problème problème

 private void btnRefresh_Click(object sender, EventArgs e) 
    { 
     //to refresh manually 
     this.Refresh(); 
     listView1.Items.Clear(); 
     /*btnEdit_Question.Enabled = true; 
     btnRepeat_Question.Enabled = true; 
     btnDelete_Question.Enabled = true;*/ 
     GetData(); 


    } 

    public void GetData() 
    { 

     try 
     { 
      now = DateTime.Now; 
      String time_date = now.ToString(); 
      myConnection = new SqlConnection(connectString); 
      listView1.Items.Clear(); 
      myConnection.Open(); 
      String MyString1 = string.Format("SELECT " + data_variables.RES_TXT_STRING_COLUMN1 + "," + data_variables.RES_TXT_STRING_COLUMN2 + "," + data_variables.RES_TXT_STRING_COLUMN3 + "," + data_variables.RES_TXT_STRING_COLUMN4 + "," + data_variables.RES_TXT_STRING_COLUMN6 + " FROM " + data_variables.RES_TXT_STRING_QUESTION_TABLE); 
      com = myConnection.CreateCommand(); 
      com.CommandText = MyString1; 
      dr = com.ExecuteReader(); 
      ListViewItem itmX; 
      //Adding the Items To The Each Column 
      while (dr.Read()) 
      { 
       itmX = new ListViewItem(); 
       itmX.Text = dr.GetValue(0).ToString(); 
       ListViewItem.ListViewSubItem aSubFooItem1 = new ListViewItem.ListViewSubItem(itmX, dr.GetValue(1).ToString()); //Creating subitems for the parent item 
       itmX.SubItems.Add(aSubFooItem1); 
       //Associating these subitems to the parent item 
       ListViewItem.ListViewSubItem aSubFooItem2 = new ListViewItem.ListViewSubItem(itmX, dr.GetValue(2).ToString()); //Creating subitems for the parent item 

       ListViewItem.ListViewSubItem aSubFooItem3 = new ListViewItem.ListViewSubItem(itmX, dr.GetValue(3).ToString()); //Creating subitems for the parent item 

       if (dr.GetValue(4).ToString() == "0") 
       { 
        aSubFooItem5 = new ListViewItem.ListViewSubItem(itmX, "No"); 
       } 
       else 
       { 
        aSubFooItem5 = new ListViewItem.ListViewSubItem(itmX, "Yes"); 
       } 

       if (dr.GetDateTime(2) < now && dr.GetDateTime(3) > now) 
       { 
        itmX.SubItems.Add(aSubFooItem2); 
        itmX.SubItems.Add(aSubFooItem3); 
        ListViewItem.ListViewSubItem aSubFooItem4 = new ListViewItem.ListViewSubItem(itmX, "In Progress"); 
        itmX.SubItems.Add(aSubFooItem4); 
        itmX.SubItems.Add(aSubFooItem5); 
        } 
       else if (dr.GetDateTime(2) <= now) 
       { 

        itmX.SubItems.Add(aSubFooItem2); 
        itmX.SubItems.Add(aSubFooItem3); 
        ListViewItem.ListViewSubItem aSubFooItem4 = new ListViewItem.ListViewSubItem(itmX, "Expired"); 
        itmX.SubItems.Add(aSubFooItem4); 
        itmX.SubItems.Add(aSubFooItem5); 
       } 
       else if (dr.GetDateTime(2) > now) 
       { 

        itmX.SubItems.Add(aSubFooItem2); 
        itmX.SubItems.Add(aSubFooItem3); 
        ListViewItem.ListViewSubItem aSubFooItem4 = new ListViewItem.ListViewSubItem(itmX, "Not Expired"); 
        itmX.SubItems.Add(aSubFooItem4); 
        itmX.SubItems.Add(aSubFooItem5); 
       } 
       //add all the items ti listview 
       listView1.Items.Add(itmX); 
       //Adding colors 
       itmX.UseItemStyleForSubItems = false; 
       foreach (ListViewItem lvi in listView1.Items) 
       { 
        if (lvi.SubItems[4].Text=="Expired") 
        { 

         lvi.SubItems[4].BackColor = Color.Red; 
        } 
        else if (lvi.SubItems[4].Text == "Not Expired") 
        { 
         itmX.SubItems[4].BackColor = Color.Yellow; 
        } 
        else 
        { 
         itmX.SubItems[4].BackColor = Color.Green; 
        } 

       } 

      } 
      EventLog log = new EventLog(data_variables.RES_TXT_STRING_LOG_EVENT); 
      try 
      { 

       log.Source = data_variables.RES_TXT_STRING_LOG_SOURCE; 

       log.WriteEntry(data_variables.REX_TXT_STRING_MESSAGE_SUCCESSFUL, EventLogEntryType.Information); 
      } 
     if (listView_Selected_Index > -1) 
     { 

       //Keep the focus in the listview 
       this.listView1.Items[listView_Selected_Index].Focused = true; 


     } 

      private void listView1_SelectedIndexChanged(object sender, EventArgs e) 
    { 

     now = DateTime.Now; 
     for (int i = 0; i < listView1.SelectedItems.Count; i++) 
     { 


     //Selecting the each values of the selected item from listview 


     listView_Selected_Index = listView1.SelectedIndices[i]; 

     } 
    } 

quelqu'un peut-il me aider comment rester l'accent sur l'élément listview même le bouton d'actualisation est d'obtenir cliqué

Répondre

1

Vous supprimez des éléments d'origine (certains sélectionnés) de la liste en haut de GetData(). Vous devez stocker quelque part ce qui est sélectionné avant de lire les nouvelles données de la base de données. Ensuite, après l'affichage des nouvelles données dans la liste, vous devez sélectionner les éléments en fonction de ce qui a été sélectionné avant l'actualisation des données.

//store selected items (id or sth else that identifies item) 
GetData(); 
//restore selection (some of previously items may no longer exist) 

Dans votre code, vous enregistrez seulement le dernier élément sélectionné pas tous.

for (int i = 0; i < listView1.SelectedItems.Count; i++) 
{ 
    //Selecting the each values of the selected item from listview 

    // here You are only saving last selected item 
    // instead of this do sth like 
    // selectedItems.Add(sth that identifies this item, not index) 
    listView_Selected_Index = listView1.SelectedIndices[i]; 
} 

également au lieu de le faire sur tous les SelectedIndexChanged Vous pouvez le faire avant que l'actualisation des données à moins que vous en avez besoin pour d'autres raisons.

0

Ce que vous pouvez faire est, enregistrer l'index actuellement sélectionné de ListView1 dans un domaine temporaire et après avoir appelé GetData() méthode réinitialiser la propriété d'index sélectionné de ListView1 en affectant la valeur de champ temporaire à ListView1.SelectedIndex propriété

quelque chose comme ceci:

private int _selectedIndex = -1; 

private void btnRefresh_Click(object sender, EventArgs e) 
    { 
     _selectedIndex = listView1.SelectedIndex; 
     //to refresh manually 
     this.Refresh(); 
     listView1.Items.Clear(); 
     /*btnEdit_Question.Enabled = true; 
     btnRepeat_Question.Enabled = true; 
     btnDelete_Question.Enabled = true;*/ 
     GetData(); 
     listView1.SelectexIndex = _selectedIndex; 


    } 
+0

Pourquoi une variable membre? Listview peut contenir de nombreux éléments. –

+0

une variable temporaire pour enregistrer le dernier index sélectionné, avec le dernier je veux dire l'index sélectionné avant d'appeler ListView1.Items.Clear – Waqas

+0

Il devrait être la variable locale de la méthode. Et de nombreux articles peuvent être sélectionnés. –