2012-08-09 36 views
1

我有一個問題給大家,我如何才能使對象數據源加載數據到gridview只有當有人點擊鏈接按鈕?我將根據用戶的搜索條件,在運行時爲對象數據源中的select方法傳遞一些參數。任何人都可以爲此提出解決方案嗎?gridview使用對象數據源控件加載數據

回答

0

將所有參數放在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

0

我假設你已經指定在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