[英]LinqDataSource: Filtering and binding to gridview
這個問題沒有按照我想要的方式解決,但是我繼續感謝ŁukaszW.pl的時間和精力。
我正在使用gridview控件和linqdatasource及其所有工作正常,我已經添加了searchBySubject的功能,並且添加了WhereParameters,而不是綁定我的gridview(請參見下面的代碼),但是不知何故,它不返回任何行,我看到我有很多根據我搜索的行。
protected void btnSearch_Click(object sender, EventArgs e)
{
this.LinqDataSource1.WhereParameters["Subject"].DefaultValue = this.txtSubject.Text;
this.GridView1.DataBind();
}
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
DataSourceID="LinqDataSource1"
EmptyDataText="There are no data records to display.">
<Columns>
<asp:BoundField DataField="UserID" HeaderText="UserID" ReadOnly="True"
SortExpression="UserID" />
<asp:BoundField DataField="Username" HeaderText="Username"
SortExpression="Username" />
<asp:BoundField DataField="FirstName" HeaderText="FirstName"
SortExpression="FirstName" />
<asp:BoundField DataField="LastName" HeaderText="LastName"
SortExpression="LastName" />
<asp:BoundField DataField="Email" HeaderText="Email" SortExpression="Email" />
</Columns>
</asp:GridView>
<asp:LinqDataSource ID="LinqDataSource1" runat="server"
ContextTypeName="MyDataContextDataContext"
onselecting="LinqDataSource_Selecting" >
<WhereParameters>
<asp:Parameter Name="Subject" />
</WhereParameters>
</asp:LinqDataSource>
public List<Reporter> GetInquiries()
{
using (MyDataContextDataContext dc = conn.GetContext())
{
var loadAll = (from spName in dc.spReporter()
select spName);
List<Reporter> reporterList = new List<Reporter>();
foreach (var item in loadAll)
{
reporterList.Add(new Reporter(item.Id, item.InqDate, item.Subject));
}
return reporterList;
}
錯誤:
The query results cannot be enumerated more than once
假設您在頁面中聲明了這樣的LinqDataSource :
<asp:LinqDataSource ID="LinqDataSource1"
runat="server"
ContextTypeName="MyDataContext"
OnSelecting="LinqDataSource1_Selecting">
<WhereParameters>
<asp:ControlParameter Name="Subject"
ControlID="txtSubject"
PropertyName="Text"
Type="String" />
</WhereParameters>
</asp:LinqDataSource>
您的LinqDataSource.Selecting事件處理程序應大致如下所示:
public void LinqDataSource1_Selecting(object sender, LinqDataSourceSelectEventArgs e)
{
var db = new MyDataContext())
var subjectFilter = e.WhereParameters("Subject");
var reporters = from spName in db.spReporter()
where spName.Subject.Contains(subjectFilter)
select new Reporter(spName.Id, spName.InqDate, spName.Subject);
e.Result = reporters;
}
或者,您可以將“主題”作為輸入參數添加到存儲過程和數據庫中的過濾中。 在這種情況下,事件處理程序將如下所示:
public void LinqDataSource1_Selecting(object sender, LinqDataSourceSelectEventArgs e)
{
var db = new MyDataContext())
var subjectFilter = e.WhereParameters("Subject");
var reporters = from spName in db.spReporter(subjectFilter)
select new Reporter(spName.Id, spName.InqDate, spName.Subject);
e.Result = reporters;
}
相關資源:
關於該問題,我看不到您的GetInquiries方法和LinqDataSource之間的任何連接。 那就是第一,第二是即使有連接,如果您要返回列表而不是IQueriable對象,它也將無法工作...
為了更好地了解與LinqDataSource的綁定,請閱讀此Scott Gu的文章
我還要向您展示可以將您的GetInquiries方法簡化為以下形式:
public List<Reporter> GetInquiries()
{
using (MyDataContextDataContext dc = conn.GetContext())
{
return (from spName in dc.spReporter()
select new Reporter(spName.Id, spName.InqDate, spName.Subject)).ToList()
}
----編輯----
替代解決方案的示例:
public List<Reporter> GetInquiries(string subject)
{
using (MyDataContextDataContext dc = conn.GetContext())
{
return (from spName in dc.spReporter()
select new Reporter(spName.Id, spName.InqDate, spName.Subject
where spName.Subject == subject)).ToList()
}
}
protected void btnSearch_Click(object sender, EventArgs e)
{
GridView1.DataSource = GetInquiries(txtSubject.Text);
GridView1.DataBind();
}
----------編輯-------------
protected void btnSearch_Click(object sender, EventArgs e)
{
this.LinqDataSource1.WhereParameters["Subject"].DefaultValue = this.txtSubject.Text;
this.GridView1.DataBind();
}
public void LinqDataSource1_Selecting(object sender, LinqDataSourceSelectEventArgs e)
{
ReporterRepository reporterRepo = new ReporterRepository();
e.Result = reporterRepo.GetInquiries();
}
public IQueryable<Reporter> GetInquiries()
{
return from spName in dc.spReporter()
select new Reporter(spName.Id, spName.InqDate, spName.Subject);
}
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataSourceID="LinqDataSource1" EmptyDataText="There are no data records to display.">
<Columns>
<asp:BoundField DataField="UserID" HeaderText="UserID" ReadOnly="True"
SortExpression="UserID" />
<asp:BoundField DataField="Username" HeaderText="Username"
SortExpression="Username" />
<asp:BoundField DataField="FirstName" HeaderText="FirstName"
SortExpression="FirstName" />
<asp:BoundField DataField="LastName" HeaderText="LastName"
SortExpression="LastName" />
<asp:BoundField DataField="Email" HeaderText="Email" SortExpression="Email" />
</Columns>
</asp:GridView>
<asp:LinqDataSource ID="LinqDataSource1" runat="server" ContextTypeName="MyDataContextDataContext" onselecting="LinqDataSource_Selecting">
<WhereParameters>
<asp:Parameter Name="Subject" />
</WhereParameters>
</asp:LinqDataSource>
問候
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.