【问题标题】:c# List view focus problemc#列表视图焦点问题
【发布时间】:2011-10-23 01:26:21
【问题描述】:

我有一个列表视图,它显示数据库中的内容。我的表单中还有一个刷新按钮。单击刷新按钮后,列表视图将再次更新。问题是单击刷新按钮时已经列表视图中的选定项目从焦点中删除。这是我的代码

       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];

        }
     }

任何人都可以帮助我如何将焦点保持在列表视图项上,即使单击了刷新按钮

【问题讨论】:

    标签: c# listview


    【解决方案1】:

    您正在从 GetData() 顶部的列表视图中删除原始(某些选定的)项目。 在从数据库读取新数据之前,您需要将选择的内容存储在某处。然后在列表视图中显示新数据后,您必须根据数据刷新之前选择的内容来选择项目。

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

    在您的代码中,您只保存最后选择的项目而不是全部。

    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];
    }
    

    也不要对每个 selectedIndexchanged 执行此操作,除非您出于其他原因需要它,否则您只能在数据刷新之前执行此操作。

    【讨论】:

      【解决方案2】:

      您可以做的是,将当前选定的ListView1 索引保存在某个临时字段中,并在调用GetData() 方法后通过将临时字段的值分配给ListView1.SelectedIndex 属性来重置ListView1 的选定索引属性

      类似这样的:

      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;
      
      
          }
      

      【讨论】:

      • 一个临时变量,用于保存最后选择的索引,最后我的意思是在调用 ListView1.Items.Clear 之前选择的索引
      • 应该是方法局部变量。并且可以选择很多项目。
      • 除了 Peri 的评论,明智的做法是不要使用“selectedIndex”存储/恢复。如果在您的 selectedItem 的位置之前在列表中添加了一项,则您将选择错误的一项。你最好为每个选定的项目存储一个唯一的属性(所以在一个列表中)。
      • 我正在将最后选择的索引保存在我的代码中,例如 listView_Selected_Index = listView1.SelectedIndices[i];如何使用此变量将焦点保持在 listview 中的同一项目中
      • 如果我在我的代码中使用 SelectexIndex,它会显示错误错误“System.Windows.Forms.ListView”不包含“SelectedIndex”的定义,并且没有扩展方法“SelectedIndex”接受第一个参数可以找到类型“System.Windows.Forms.ListView”(您是否缺少 using 指令或程序集引用?)
      猜你喜欢
      • 2011-09-06
      • 2010-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-20
      • 1970-01-01
      相关资源
      最近更新 更多