【问题标题】:DataView.RowFilter in DataTable does not return filtered recordsDataTable 中的 DataView.RowFilter 不返回过滤后的记录
【发布时间】:2015-11-04 10:43:57
【问题描述】:

我有一个 DataTable dt,其中有 1200 条记录。 下面是代码:

DataTable dt = new DataTable();
dt = GetAccCode(c);

现在,我想使用 DataView 过滤 dt 的记录,基于 1 列。 下面是代码:

已编辑

 DataView dv = new DataView(dt);
    dv.RowFilter = "AccountDescription LIKE '" + e.Text + "' " ;
    dv.RowFilter = "Isnull(AccountDescription,'NULL') <> 'NULL'";

    //dv.RowStateFilter = DataViewRowState.ModifiedCurrent;  
    if (dv.Count > 0)
    {
        dt = dv.ToTable(); 
    }

完整代码:
C# 代码:

private const int ItemsPerRequest = 50;

    private static string GetStatusMessage(int offset, int total)
    {
        if (total <= 0)
            return "No matches";

        return String.Format("Items <b>1</b>-<b>{0}</b> out of <b>{1}</b>", offset, total);
    }

    public DataTable GetTable()
    {
        //  columns.
        DataTable table = new DataTable();
        table.Columns.Add("AccountCodeID", typeof(Guid));
        table.Columns.Add("AccountDescription", typeof(string));
        // DataRows.
        table.Rows.Add(Guid.NewGuid(), "9830.58578 Furniture&Food counter ");
        table.Rows.Add(Guid.NewGuid(), "09.323232 New-release add ons");
        table.Rows.Add(Guid.NewGuid(), "84.238799 G&D - Depot from Outerjoin");
        table.Rows.Add(Guid.NewGuid(), "141.44445043-Random&Access-Memory hydero 048kkjug ");
        table.Rows.Add(Guid.NewGuid(), "142.85223 Account's hyqure");
        table.Rows.Add(Guid.NewGuid(), "324.989384934 F&D Admin-Dept Working ");
        table.Rows.Add(Guid.NewGuid(), "77.234434 Unique's Question why not's so");
        return table;
    }

    protected void ddlAccountCode_ItemsRequested(object sender, RadComboBoxItemsRequestedEventArgs e)
    {
        string c = ddlCompany.SelectedValue.ToString();

        DataTable dt = GetTable();
        DataView dv = new DataView(dt);
        string searchParamText = e.Text;
        dv.RowFilter = string.Format("AccountDescription LIKE '%{0}%'", searchParamText);
        //dv.RowStateFilter = DataViewRowState.ModifiedCurrent;

        int a = dv.Count;
        if (dv.Count > 0)
        {
            dt = dv.ToTable();
        }

        RadComboBox combo = (RadComboBox)sender;

        int itemOffset = e.NumberOfItems;
        int endOffset = Math.Min(itemOffset + ItemsPerRequest, dt.Rows.Count);
        e.EndOfItems = endOffset == dt.Rows.Count;

        for (int i = itemOffset; i < endOffset; i++)
        {
            combo.Items.Add(new RadComboBoxItem(dt.Rows[i]["AccountDescription"].ToString(), dt.Rows[i]["AccountDescription"].ToString()));
        }

        e.Message = GetStatusMessage(endOffset, dt.Rows.Count); 
    }

HTML 代码:

    <EditItemTemplate>
         <asp:Label ID="lblAcCode2" runat="server" Text='<%# Eval("AccountCode") + " - " + Eval("AccountDescription")%>' Visible="false"> 
         </asp:Label>

         <telerik:RadComboBox ID="ddlAccountCode" runat="server" Height="200" Width="240" DropDownWidth="310" HighlightTemplatedItems="true" CausesValidation="true" OnItemsRequested="ddlAccountCode_ItemsRequested" ItemsPerRequest="10" EnableLoadOnDemand="True" ShowMoreResultsBox="true" EnableVirtualScrolling="true" Filter="Contains" AppendDataBoundItems="true" DataTextField="AccountDescription" DataValueField="AccountCodeID">
         </telerik:RadComboBox> 

    </EditItemTemplate>

但每次 dt 返回所有 1200 条记录,而不是过滤后的记录。

要求:当我点击 RadComboBox 时,它会进入 _ItemRequested 事件。我希望当我在 RadComboBox 中搜索任何记录时,如果记录在 DataTable 中,那么它应该转到 GetStatusMessage ELSE 部分,或者如果在 DataTable 中没有搜索到的记录,那么它应该转到 GetStatusMessage IF 部分。 为了从 DataTable 中获取 RadComboBox 的搜索记录,我使用的是 DataView.RowFilter 方法,但是每次我在 RadCombo 中键入任何文本时,它都不会返回搜索到的值并始终显示 DataView.Count =0

请回复如何解决这个问题。我被困了 2 天。

【问题讨论】:

  • 你在申请RowFilter后尝试过dv.RowStateFilter = DataViewRowState.ModifiedCurrent;
  • @MohitShrivastava:感谢您的回复。但是当我在我的代码中添加你建议的行时(请再次检查我发布的问题,我已经修改了它)每次dv.count = 0 ,当我进行过滤时我仍然没有得到过滤的数据。请回复
  • 试试这个dv.RowFilter = "Isnull(AccountDescription,'NULL') &lt;&gt; 'NULL'";
  • 为了确保它必须过滤记录,请尝试"AccountDescription LIKE %'" + e.Text + "'%";
  • @MohitShrivastava:请检查我编辑的代码。当我尝试使用dv.RowStateFilter = DataViewRowState.ModifiedCurrent; 行时,每次dv.count=0 以及当我使用当前编辑的代码时,每次dv.count=&lt;total records of dt&gt;i.e.,1200 请建议我应该更改什么以获得所需的结果。

标签: c# asp.net datatable dataview


【解决方案1】:

我相信这可能会解决您的问题。

DataTable dt = new DataTable();
dt = GetAccCode(c);
DataView dv = new DataView(dt);
dv.RowFilter = "AccountDescription LIKE '%" + e.Text + "%'" ;
dv.RowFilter = "Isnull(AccountDescription,'') <> ''";

dv.RowStateFilter = DataViewRowState.ModifiedCurrent;  
if (dv.Count > 0)
{
   dt = dv.ToTable(); 
}

仅出于测试目的,您还可以对值进行硬编码并查看它是否会更改结果。例如:

dv.RowFilter = "AccountDescription LIKE '%mo%'" ;

并省略或注释该行

//dv.RowFilter = "Isnull(AccountDescription,'') <> ''";

看看你得到了什么结果。

【讨论】:

  • 不知道发生了什么问题。每次我得到dv.count=0 的过滤记录。此外,dv.RowFilter = "AccountDescription LIKE %'" + e.Text + "'%" ; 返回所有记录 1200,而不是仅过滤记录。我从 2 天开始就陷入了这个问题..无法理解这个问题。请帮忙
  • 非常感谢您的帮助。请再次检查我发布的问题,在那里我添加了完整代码(在 Full Code 部分下)以及需求描述。如果我的要求有任何混淆,请告诉我。等待您的回复
  • 还有一件事:当我在这一行硬编码e.Text 时:string searchParamText = e.Text; 它给了我预期的输出。但是当我直接使用这条线时,它永远不会给出预期的输出。这是我面临的唯一问题。如果这得到解决,我的要求将完成。请回复
  • 朋友,那么问题不在于代码,而在于您使用的输入。调试时e.Text的值是多少。
  • e.Text value 是我在 RadComboBox 中键入的任何内容。当我使用 string searchParamText = e.Text; 时,它会返回 DataView.RowCount 中的所有 DataTable 行,而当我对 e.Text 值进行硬编码时,它会给出预期的输出。请告诉我的代码有什么问题。
【解决方案2】:

我之前使用过下面的代码,但它不起作用。现在它突然开始工作了:

        DataTable dt = GetAccCode(c);
        DataView dv = new DataView(dt);
        string txt = e.Text;
        dv.RowFilter = string.Format("AccountDescription LIKE '%{0}%'", txt);       
        int a = dv.Count;
        if (dv.Count > 0)
        {
            dt = dv.ToTable();
        }

问题已解决。感谢您的帮助@Mohit Shrivastava

【讨论】:

    【解决方案3】:

    尝试更改 RowState

    dv.RowStateFilter = DataViewRowState.CurrentRows
    

    【讨论】:

      猜你喜欢
      • 2019-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多