gridview使用对象数据源控件加载数据

问题描述:

我有一个问题给大家,我如何才能使对象数据源加载数据到gridview只有当有人点击链接按钮?我将根据用户的搜索条件,在运行时为对象数据源中的select方法传递一些参数。任何人都可以为此提出解决方案吗?gridview使用对象数据源控件加载数据

+0

嗨LC,我可以分配ObjectDataSource控件到数据集。如果有什么可以建议我一些示例代码 – SPL 2012-08-09 14:03:10

将所有参数放在HiddenField中,其中一个HDF必须是一个标志,用于决定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

+0

嗨哈尔顿,我可以分配objectdatasource控制数据集。如果有什么可以建议我一些示例代码 – SPL 2012-08-09 14:03:37

+0

Hi @SPL,这里是代码示例。 – Hailton 2012-08-09 23:45:20

我假设你已经指定在ObjectDataSource控件的每个参数值来源。

你需要做的是搜索按钮的点击事件指定数据源,并明确结合电网如下:

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

嗨生锈的向导,我可以分配objectdatasource控制数据集。如果有什么可以建议我一些示例代码 – SPL 2012-08-09 14:16:32

+0

嘿生锈的向导,有无论如何,selectmethod提到的对象数据源控件被点击按钮时触发。为什么我问的是,我所说的按钮是一个提交按钮,它必须通过接受表单中的用户输入来激发对象数据源控件所提及的方法。 – SPL 2012-08-09 20:13:24

+0

@SPL对于你的第一个问题,你的意思是你是否可以将一个DataSet赋值给一个ObjectDataSource控件?如果是这样,那么你可以。您通过创建类似于Hailton的** QueryMyDataPoco()**方法的方法来实现此目的,除了不返回** IEnumerable **之外,您返回** DataSet **。 至于你在我上面的回复中提到的问题。如果不是很清楚,请告诉我。 – 2012-08-10 04:29:07