【问题标题】:gridview loading of data using object data source control使用对象数据源控件的gridview加载数据
【发布时间】:2014-02-22 07:53:47
【问题描述】:

我有一个问题要问大家,我怎样才能让对象数据源仅在有人单击链接按钮时才将数据加载到网格视图中?主要我要在运行时根据用户的搜索条件为对象数据源中的 select 方法传递一些参数。任何人都可以为此提出解决方案吗?

【问题讨论】:

    标签: c#


    【解决方案1】:

    【讨论】:

    • 嗨,lc,我可以将对象数据源控件分配给数据集吗?如果有什么可以建议我一些示例代码
    【解决方案2】:

    我假设您已经为 ObjectDataSource 控件中的每个参数值指定了哪个来源。

    您需要做的是在搜索按钮的点击事件上指定数据源并显式绑定网格,如下所示:

    gridView1.DataSource = objectDataSource1;
    gridView1.DataBind();
    

    【讨论】:

    • 嗨 Rusty 向导,我可以将 objectdatasource 控件分配给数据集吗?如果有什么可以建议我一些示例代码
    • 嘿,生锈的向导,无论如何,在对象数据源控件中提到的 selectmethod 是否会在单击按钮时被触发。为什么我要问的是我正在谈论的按钮是一个提交按钮,它必须通过接受表单中的用户输入来触发对象数据源控件提到的方法。
    • @SPL 对于第一个问题,您的意思是是否可以将 DataSet 分配给 ObjectDataSource 控件?如果是这样,那么是的,你可以。您可以通过创建一个类似于 Hailton 的 QueryMyDataPoco() 方法的方法来实现这一点,只不过不是返回 IEnumerable,而是返回一个 DataSet。至于我在上面的回复中提到的你的问题。如果不是很清楚,请告诉我。
    • 嘿生锈的向导,我的问题是我们可以像处理事件一样处理对象数据源,而不是在 page_load() 处执行所有操作
    • @SPL 很抱歉,但我不明白您将 ObjectDataSource 用作事件是什么意思。
    【解决方案3】:

    把所有参数都放在HiddenField中,其中一个HDF必须是一个flag,用来决定select方法是否必须返回查询项。看到这个answer

    代码示例:

    FilterGridView.aspx:

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="FilterGridView.aspx.cs"
        Inherits="Q11876988WebApp.FilterGridView" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <%--
            Fields for user inputs
            --%>
            &nbsp;Id:
            <asp:TextBox ID="TxtId" runat="server"></asp:TextBox>
            &nbsp;Name:
            <asp:TextBox ID="TxtName" runat="server"></asp:TextBox>
            &nbsp;Phone:
            <asp:TextBox ID="TxtPhone" runat="server"></asp:TextBox>
            <%--
            Button to perform query
            --%>
            <asp:Button ID="BtnQuery" runat="server" OnClick="BtnQuery_Click" Text="Query" />
            <%--
            Hidden Fields used as parameters
            --%>
            <asp:HiddenField ID="HdfId" runat="server" />
            <asp:HiddenField ID="HdfName" runat="server" />
            <asp:HiddenField ID="HdfPhone" runat="server" />
            <%--'false': Avoid query execution before 'BtnQuery' click.--%>
            <asp:HiddenField ID="HdfDoQuery" runat="server" Value="false" />
            <%--
            GridView
            --%>
            <asp:GridView ID="GrvMyData" runat="server" AutoGenerateColumns="False" DataSourceID="OdsMyData">
                <Columns>
                    <asp:BoundField DataField="Id" HeaderText="Id" SortExpression="Id" />
                    <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
                    <asp:BoundField DataField="Phone" HeaderText="Phone" SortExpression="Phone" />
                </Columns>
            </asp:GridView>
            <%--
            ObjectDataSource and parameters related to Hidden Fields
            --%>
            <asp:ObjectDataSource ID="OdsMyData" runat="server" OldValuesParameterFormatString="original_{0}"
                SelectMethod="QueryMyDataPoco" TypeName="Q11876988WebApp.FilterGridViewODS">
                <SelectParameters>
                    <asp:ControlParameter ControlID="HdfId" ConvertEmptyStringToNull="False" Name="id"
                        PropertyName="Value" Type="String" />
                    <asp:ControlParameter ControlID="HdfName" ConvertEmptyStringToNull="False" Name="name"
                        PropertyName="Value" Type="String" />
                    <asp:ControlParameter ControlID="HdfPhone" ConvertEmptyStringToNull="False" Name="phone"
                        PropertyName="Value" Type="String" />
                    <asp:ControlParameter ControlID="HdfDoQuery" ConvertEmptyStringToNull="False" Name="doQuery"
                        PropertyName="Value" Type="Boolean" />
                </SelectParameters>
            </asp:ObjectDataSource>
        </div>
        </form>
    </body>
    </html>
    

    FilterGridView.aspx.cs:

    public partial class FilterGridView : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
        }
    
    
        protected void BtnQuery_Click(object sender, EventArgs e)
        {
            //change this values causes the 'OdsMyData' 'DataBind'.
            this.HdfId.Value = this.TxtId.Text;
            this.HdfName.Value = this.TxtName.Text;
            this.HdfPhone.Value = this.TxtPhone.Text;
            this.HdfDoQuery.Value = true.ToString();
        }
    }
    

    FilterGridViewODS.cs:

    /// <summary>
    /// Class for a ObjectDataSource
    /// </summary>
    [DataObject]
    public class FilterGridViewODS
    {
        private static IList<MyDataPoco> MyDataList = new List<MyDataPoco>();
    
        /// <summary>
        /// Static constructor. Creates a list of 50 items.
        /// </summary>
        static FilterGridViewODS()
        {
            for (int i = 0; i < 50; i++)
            {
                MyDataList.Add(
                    new MyDataPoco()
                    {
                        Id = i.ToString(),
                        Name = "Name " + i,
                        Phone = i + "" + i + "" + i + "." + i + "" + i + "" + i + "" + i + ""
                    });
            }
        }
    
        /// <summary>
        /// if <paramref name="doQuery"/> is <c>true</c>, performs a 
        /// query over the data content, Otherwise return an empty list.
        /// </summary>
        [DataObjectMethod(DataObjectMethodType.Select)]
        public IEnumerable<MyDataPoco> QueryMyDataPoco(String id, String name, String phone, bool doQuery)
        {
            if (doQuery)
            {
                IEnumerable<MyDataPoco> filteredEnum =
                    from md in MyDataList
                    where
                        md.Id.Contains(id)
                        && md.Name.Contains(name)
                        && md.Phone.Contains(phone)
                    select md;
    
                return filteredEnum;
            }
            else
            {
                //returning an empty list.
                return new List<MyDataPoco>();
            }
        }
    }
    

    MyDataPoco.cs:

    public class MyDataPoco
    {
        public String Id { get; set; }
        public String Name { get; set; }
        public String Phone { get; set; }
    }
    

    完整来源:Q11874496WebApp.7z

    【讨论】:

    • 嗨,Hailton,我可以将 objectdatasource 控件分配给数据集吗?如果有什么可以建议我一些示例代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-30
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    相关资源
    最近更新 更多