【问题标题】:C# Telerik Grid data binding not reloadingC# Telerik Grid 数据绑定未重新加载
【发布时间】:2017-12-05 17:29:20
【问题描述】:

我想动态绑定 Telerik 网格中的数据。 最初我使用下面的代码。

protected void radGridItemList_NeedDataSource(object sender, GridNeedDataSourceEventArgs e)
        {
            var gridItemList = sender as RadGrid;
            var repoItemMaster = CreateIItemMasterRepository();
            var ItemList = repoItemMaster.GetAll();
            gridItemList.DataSource = ItemList;
}

现在我想用过滤后的 ItemNumber 重新加载 gridItemList(例如,从 ItemMaster 中选择 ItemNumber,其中 ItemNumber LIKE 'a%')并再次将新数据源绑定到网格。

我做了类似的事情,但它不起作用。

private void LoadItemListByItemNumber(string ItemNumber)
        {
            var gridItemList = radcmbItemNumber.Items[0].FindControl("radGridItemList") as RadGrid;
            string whereCondition = "a.ItemNumber LIKE '"+ ItemNumber + "%'";

            var repoItemMaster = CreateIItemMasterRepository();        
            List<ItemMaster> itemList = repoItemMaster.FindbyItemNumber(ItemNumber, whereCondition);
            gridItemList.DataSource = itemList;
        }       

有什么建议吗?

【问题讨论】:

  • 在分配新数据源后尝试使用Grid.Rebind()
  • 否 它不是那样工作的。当您说重新绑定时,它将再次调用 radGridItemList_NeedDataSource() 并加载以前的数据集。

标签: c# telerik grid dynamic-binding


【解决方案1】:

在使用高级数据绑定 (RadGrid1_OnNeedDataSource()) 时,您可以使用内置的 RadGrid 功能来过滤由自定义对象组成的数据源。

要在 RadGrid 中执行此操作,只需通过设置 AllowFilteringByColumn="True" 启用过滤,RadGrid 将自动过滤您的数据源。

您也可以在外部通过设置当前过滤器表达式并在 RadGrid 上调用 rebind() 来执行此操作。

ASPX:

<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
<asp:Button ID="Button1" runat="server" Text="Filter by 1" OnClick="Button1_Click" />
<telerik:RadGrid ID="RadGrid1" runat="server" OnNeedDataSource="RadGrid1_NeedDataSource" AllowFilteringByColumn="True" CellSpacing="-1" GridLines="Both" EnableLinqExpressions="false" AllowPaging="True"></telerik:RadGrid>

C#:

 // <summary>
// Demo cusotm object
// </summary>
public class MyObject
{
    public int ItemNumber { get; set; }
    public string ItemName { get; set; }
}

protected void RadGrid1_NeedDataSource(object sender, Telerik.Web.UI.GridNeedDataSourceEventArgs e)
{
    //  Bind RadGrid         
    RadGrid1.DataSource = this.GetData();
}

// <summary>
// Returns a Demo custom object DataSource
// </summary>
// <returns></returns>
private List<MyObject> GetData()
{
    List<MyObject> data = new List<MyObject>();
    for (int i = 0; (i <= 100); i++)
    {
        var item = new MyObject();
        item.ItemNumber = i;
        item.ItemName = ("Item # " + i);
        data.Add(item);
    }
    return data;
}

protected void Button1_Click(object sender, EventArgs e)
{
    RadGrid1.MasterTableView.FilterExpression = "([ItemName] LIKE \'%1%\')";
    RadGrid1.Rebind();
}

一些可以查看的链接:

Advanced DataBinding

Advanced Data Binding Tips

Manual Filtering

【讨论】:

  • 感谢迈克的帮助。它部分工作。在我的网格中,我启用了 paging 。当我在combo中键入一些文本时,当我转到网格的第二页时可以看到搜索结果并且搜索结果是正确的。网格的第一页没有刷新
  • 我的荣幸。我不太明白您对您所面临问题的描述。另外,你说的组合是什么意思?我已经更新了我的答案以包括分页。一切似乎都在工作。也许您应该发布您的标记和代码,否则可能有很多原因导致它在您的特定场景中不起作用。
  • 好的,我们开始吧。我尝试在我的 .aspx 和 .cs 页面上为您提供详细信息。
【解决方案2】:

.aspx

<div class="col-lg-8 qb-col">
                                                    <telerik:RadComboBox ID="radcmbItemNumber" runat="server"
                                                        MarkFirstMatch="True" 
                                                        AllowCustomText="true"
                                                        OnClientDropDownOpening="radcmbItemNumberOnClientDropDownOpening"                                                      
                                                        OnClientKeyPressing="radcmbItemNumberOnKeyPress"                                                                                                                
                                                        OnTextChanged="radcmbItemNumber_TextChanged"                                                      
                                                        Width="95%" 
                                                        CssClass="qb-input-combo"
                                                        ExpandAnimation-Type="None">
                                                        <ItemTemplate>
                                                            <telerik:RadGrid ID="radGridItemList" runat="server" CssClass="GridStyle1"
                                                                AutoGenerateColumns="false" AllowPaging="true"
                                                                AllowSorting="true" AllowFilteringByColumn="true"
                                                                OnNeedDataSource="radGridItemList_NeedDataSource"
                                                                EnableLinqExpressions="false">
                                                                <GroupingSettings CaseSensitive="false" />
                                                                <PagerStyle Mode="NextPrevAndNumeric" />
                                                                <MasterTableView DataKeyNames="ItemNumber" ClientDataKeyNames="ItemNumber">
                                                                    <Columns>
                                                                        <telerik:GridBoundColumn UniqueName="ItemNumber" DataField="ItemNumber"
                                                                            HeaderText="Item Number" AutoPostBackOnFilter="true"
                                                                            FilterControlWidth="100px">
                                                                            <HeaderStyle Width="150px" />
                                                                        </telerik:GridBoundColumn>
                                                                        <telerik:GridBoundColumn UniqueName="RevisionNumber" DataField="RevisionNumber"
                                                                            HeaderText="Revision Number" AutoPostBackOnFilter="true"
                                                                            FilterControlWidth="100px">
                                                                            <HeaderStyle Width="150px" />
                                                                        </telerik:GridBoundColumn>
                                                                        <telerik:GridBoundColumn UniqueName="Description" DataField="Description"
                                                                            HeaderText="Description" AutoPostBackOnFilter="true"
                                                                            FilterControlWidth="100px">
                                                                            <HeaderStyle Width="150px" />
                                                                        </telerik:GridBoundColumn>

                                                                    </Columns>
                                                                </MasterTableView>
                                                                <ClientSettings>
                                                                    <ClientEvents OnRowClick="radGridItemListOnRowClicked" />
                                                                    <Scrolling AllowScroll="true" UseStaticHeaders="true" />
                                                                </ClientSettings>
                                                            </telerik:RadGrid>
                                                        </ItemTemplate>
                                                        <Items>
                                                            <telerik:RadComboBoxItem runat="server" Text=" "></telerik:RadComboBoxItem>
                                                        </Items>
                                                    </telerik:RadComboBox>
                                                    <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server"
                                                                                        ControlToValidate="radcmbItemNumber" ErrorMessage="!"
                                                                                        ForeColor="Red" 
                                                                                        SetFocusOnError="true" />
                                                </div>

我使用了一个组合,当它单击时,我需要将搜索结果加载到一个网格中,以获取在组合框中键入的内容。 这是我的 .cs

 protected void radcmbItemNumber_TextChanged(object sender, EventArgs e)
        {
            string textToSearch = radcmbItemNumber.Text.ToString();
            var gridItemList = radcmbItemNumber.Items[0].FindControl("radGridItemList") as RadGrid;
            if (!string.IsNullOrEmpty(textToSearch))
                gridItemList.MasterTableView.FilterExpression = "([ItemNumber] LIKE \'%" + textToSearch + "%\')";

            gridItemList.MasterTableView.Rebind();
}

因此,此文本更改完美运行,但在我的网格中,新搜索结果不会重新加载,直到我转到第二页。希望这是有道理的。如果您需要更多信息,请告诉我。谢谢

【讨论】:

  • 不确定到底是什么导致了您的问题。我会使用常规的 html 表作为 并使用 RadComboBox 的内置过滤来搜索数据。查看此链接:Databind Template
  • 谢谢迈克。我也会试试这个方法。
猜你喜欢
  • 1970-01-01
  • 2019-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多