【发布时间】: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') <> 'NULL'"; -
为了确保它必须过滤记录,请尝试
"AccountDescription LIKE %'" + e.Text + "'%"; -
@MohitShrivastava:请检查我编辑的代码。当我尝试使用
dv.RowStateFilter = DataViewRowState.ModifiedCurrent;行时,每次dv.count=0以及当我使用当前编辑的代码时,每次dv.count=<total records of dt>i.e.,1200 请建议我应该更改什么以获得所需的结果。
标签: c# asp.net datatable dataview