我在解决列表视图问题时遇到了麻烦。我有一个列表视图,它从连接到na sql数据库的数据表中读取。我想能够过滤它抛出一个textbox textchanged句柄,但我有以下问题?-不能退格,搜索不会更新;-不能得到选中的项目;
private void filtro_TextChanged(object sender, EventArgs e)
{
//searchData(filtro.Text);
List<ListViewItem> showitems = new List<ListViewItem>();
if (filtro.Text != "")
{
for (int i = ListViewVistas.Items.Count - 1; i >= 0; i--)
{
var item = ListViewVistas.Items[i];
if (item.Text.ToLower().Contains(filtro.Text.ToLower()))
{
item.Selected = true;
item.BackColor = SystemColors.HighlightText;
item.ForeColor = SystemColors.InfoText;
}
else
{
ListViewVistas.Items.Remove(item);
}
}
if (ListViewVistas.SelectedItems.Count == 1)
{
ListViewVistas.Focus();
}
}
else
UpdateViews();
public void UpdateViews()
{
ListViewVistas.Clear();
//IR BUSCAR O DICIONARIO PARA DEPOIS VER SE AS VISTAS JA ESTAO ASSOCIADAS OU NÃO
string m_IdFicheiroDesenho = "";
NomeFicheiro FicheiroActivo = new NomeFicheiro();
DataBase DbId = new DataBase();
DbId.IdFichDesFromReferencia(FicheiroActivo.NomeReferencia, out m_IdFicheiroDesenho);
Dictionary<int, List<string>> dicVistasFicheiroDesenho = DbId.GetDictionaryVistasFicheirosDesenho(m_IdFicheiroDesenho);
string[] ListItemTxt = new string[4];
ListViewVistas.View = System.Windows.Forms.View.Details;
ListViewVistas.GridLines = true;
ListViewVistas.FullRowSelect = true;
ListViewVistas.Columns.Add("Vista ou Sheet");
ListViewVistas.Columns.Add("Ficheiro de Desenho");
ListViewVistas.Columns.Add("Designação");
ListViewVistas.Columns.Add("Id");
ListViewVistas.Columns[0].Width = 230;
ListViewVistas.Columns[1].Width = 180;
ListViewVistas.Columns[1].TextAlign = HorizontalAlignment.Left;
ListViewVistas.Columns[2].Width = 420;
ListViewVistas.Columns[2].TextAlign = HorizontalAlignment.Left;
ListViewVistas.Columns[3].Width = 30;
ListViewVistas.Columns[3].TextAlign = HorizontalAlignment.Left;
ListViewVistas.CheckBoxes = true;
ListViewVistas.Items.Clear();
if (checkBoxViews.Checked)...
有谁可以帮我??
发布于 2018-10-16 03:25:27
我看不到从数据库加载数据的代码,所以我不能直接评论您需要做什么,但从概念上讲,您应该将加载的数据转换为ListViewItems并将它们存储在列表中。这将是您将用于过滤的主列表。
List<ListViewItem> masterlist = new List<ListViewItem>();
这个列表应该作为一个类级别的变量出现在你的表单上。
在TextChanged事件中,您将使用主列表来检索与您的筛选器匹配的项目:
public void filtro_TextChanged(object sender, EventArgs e)
{
ListViewVistas.Items.Clear();
foreach(ListViewItem item in masterlist.Where(lvi => lvi.Text.ToLower().Contains(filtro.Text.ToLower())))
{
ListViewVistas.Items.Add(item);
}
}
或者,如果你是极简主义的粉丝,你可以将上面的内容简化为:
public void filtro_TextChanged(object sender, EventArgs e)
{
ListViewVistas.Items.Clear();
ListViewVistas.Items.AddRange(masterlist.Where(lvi => lvi.Text.ToLower().Contains(filtro.Text.ToLower())).ToArray());
}
如果您选中一个列表,它将保持选中状态,因为您没有重新创建列表视图项。
发布于 2018-10-17 16:22:27
谢谢手袋蟹的答案,但这不起作用。这是从数据库加载contente的代码的一部分
else
if (!checkBoxAssociados.Checked)
{
ListItemTxt[0] = view.ViewType.ToString() + ": " + view.ViewName.ToString();
ListItemTxt[1] = " - ";
ListItemTxt[2] = "Vista não Associada! Clique aqui para Associar Vista"; //POR DEFEITO A VISTA NÃO ESTÁ ASSOCIADA
//VER SE A VISTA ESTÁ ASSOCIADA OU NAO
if (dicVistasFicheiroDesenho.ContainsKey(view.Id.IntegerValue))
{
ListItemTxt[2] = dicVistasFicheiroDesenho[view.Id.IntegerValue][0];//Designacao
ListItemTxt[1] = dicVistasFicheiroDesenho[view.Id.IntegerValue][1];//Referencia
}
ListItemTxt[3] = view.Id.IntegerValue.ToString();
ListViewItem lvi = new ListViewItem(ListItemTxt);
ListViewVistas.Items.Add(lvi);
}
}
}
if (checkBoxSheets.Checked)
{
foreach (Autodesk.Revit.DB.ViewSheet viewSheet in m_selectViewsData.PrintableSheets)
{
ListItemTxt[0] = viewSheet.ViewType.ToString() + ": " + viewSheet.SheetNumber + " - " +
viewSheet.ViewName.ToString();
ListItemTxt[1] = " - ";
ListItemTxt[2] = "Vista não Associada! Clique aqui para Associar Vista"; //POR DEFEITO A VISTA NÃO ESTÁ ASSOCIADA
//VER SE A VISTA ESTÁ ASSOCIADA OU NAO
if (dicVistasFicheiroDesenho.ContainsKey(viewSheet.Id.IntegerValue))
{
ListItemTxt[2] = dicVistasFicheiroDesenho[viewSheet.Id.IntegerValue][0];//Designacao
ListItemTxt[1] = dicVistasFicheiroDesenho[viewSheet.Id.IntegerValue][1];//Referencia
}
ListItemTxt[3] = viewSheet.Id.IntegerValue.ToString();
ListViewItem lvi = new ListViewItem(ListItemTxt);
ListViewVistas.Items.Add(lvi);
}
}
if (ListViewVistas.SelectedIndices.Count > 0)
{
}
https://stackoverflow.com/questions/52820163
复制相似问题