C# ASP.NET GridView更新源,但不更新命令

C# ASP.NET GridView更新源,但不更新命令,c#,asp.net,xml,gridview,filtering,C#,Asp.net,Xml,Gridview,Filtering,我有一个网格视图。它的数据源来自XML,通过在列表中添加一些XMLElemen,然后将列表设置为它的数据源。现在我正在实现一个搜索功能 因此,我以这种方式过滤列表: protected void btnSearch_Click(object sender, EventArgs e) { XmlDocument doc = new XmlDocument(); doc.Load(prog); //Percorso file xml L

我有一个网格视图。它的数据源来自XML,通过在列表中添加一些XMLElemen,然后将列表设置为它的数据源。现在我正在实现一个搜索功能

因此,我以这种方式过滤列表:

 protected void btnSearch_Click(object sender, EventArgs e)
    { 

        XmlDocument doc = new XmlDocument();
        doc.Load(prog); //Percorso file xml

        List<string> nomi = new List<string>();

        XmlElement root = doc.DocumentElement;

        XmlNodeList elemLists = root.GetElementsByTagName("nome");
        // this binds the gridview to the title text to display
        for (int i = 0; i < elemLists.Count; i++)
        {
            if(elemLists[i].InnerXml.ToString().ToLower().StartsWith(txtSearchMaster.Text.ToLower()) || 
                elemLists[i].InnerXml.ToString().ToLower() == txtSearchMaster.Text.ToLower() ||
                elemLists[i].InnerXml.ToString().ToLower().EndsWith(txtSearchMaster.Text.ToLower()) ||
                elemLists[i].InnerXml.ToString().ToLower().Contains(txtSearchMaster.Text.ToLower()))

                nomi.Add(elemLists[i].InnerXml.ToString());
        }


        GridView1.DataSource = nomi.OrderBy(q => q).ToList();
        GridView1.DataBind();
    }
protectedvoidbtnsearch\u单击(对象发送方,事件参数e)
{ 
XmlDocument doc=新的XmlDocument();
doc.Load(prog);//Percorso文件xml
列表nomi=新列表();
XmlElement根=doc.DocumentElement;
XmlNodeList elemLists=root.GetElementsByTagName(“nome”);
//这会将gridview绑定到要显示的标题文本
for(int i=0;iq.ToList();
GridView1.DataBind();
}
数据显示正确,但问题是,当我单击自动生成的列旁边的按钮并获取单元格内容(即列表中的一个元素)时,它返回相同索引处的单元格内容,但返回以前数据的内容


如何克服这个问题?

这里的问题是,您的“过滤器”只在搜索单击时应用。如果您在存储搜索词的位置具有隐藏状态,并在每次回发时应用该状态,如果该状态存在,则单击网格按钮将起作用

<asp:HiddenField ID="SearchString" runat="server" value="" />
然后在页面加载中添加过滤器逻辑

if (IsPostBack) {
   // filter on hidden value if not empty.
   if (!String.IsNullOrEmpty(SearchString.Value)) {
       // filter here
   }
}
只是通过添加

if (!IsPostBack)
{   
   ...
}

在页面中,加载并将过滤器登录到搜索按钮中,单击方法。

因此我必须存储搜索字段,然后刷新页面并在之后进行过滤?有没有不刷新的方法?网格在命令执行时刷新页面(并进行html替换)。这是为了确保当网格刷新页面时,其结果与之前的结果相同。这似乎基本上回答了您的问题。请通过接受他的答案而不是创造你自己的答案来帮助社区。@Win好吧,事实上他说了另一件事。如果他的回答能解决我的问题,我会接受,但事实并非如此。因此,我没有接受他的无效答案,而是为下一个解决这个问题的人写下了我找到的答案。我明白了。如果你愿意,你可以建议他改变答案或引导他找到正确的解决方案。不管怎么说,我很高兴你解决了这个问题。我相信我的答案会管用,可能有一点不对,但我不知道,因为我没有在他的代码前面的优势。我相信Alfred的工作原理是因为网格有ViewState,不在回发时填充网格也是一个有效的解决方案。但如果“回帖”提示让他找到了答案,则应将其标记为有用但不被接受。我想这就是平衡。
if (!IsPostBack)
{   
   ...
}