我什至不知道如何清楚地说明这一点,而且代码太多,无法全部粘贴在这里。
让我从一般描述开始,也许它会敲响警钟。我有一个使用 ObjectDataSource 的 DataGrid。 ObjectDataSource 使用 SelectMethod 调用另一个方法,因为需要两个日期选择器来过滤结果。
但是,当 SelectMethod 触发时,日期选择器始终为空。
一个相关的问题是需要一个按钮来使 ObjectDataSource 选择并使用两个根本不起作用的日期选择器值。就好像 ObjectDataSource 不咨询 GridView 以获取起始索引等。
如果有人知道类似这种设置的示例(GridView、Date 控件、按钮、ObjectDataSource),那就太好了。
编辑:这是代码。
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
<asp:Label ID="Label39" CssClass="txtSelect" runat="server" Text="Start Date" />
<cc1:datepicker ID="startDatePicker" runat="server" Width="70px" PaneWidth="150px" SelectedDate="1/1/2000">
<panetablestyle bordercolor="#707070" borderwidth="1px" borderstyle="Solid" />
<paneheaderstyle backcolor="#0099FF" />
<titlestyle forecolor="White" font-bold="true" />
<nextprevmonthstyle forecolor="White" font-bold="true" />
<nextprevyearstyle forecolor="#E0E0E0" font-bold="true" />
<dayheaderstyle backcolor="#E8E8E8" />
<todaystyle backcolor="#FFFFCC" forecolor="#000000" font-underline="false" bordercolor="#FFCC99" />
<alternatemonthstyle backcolor="#F0F0F0" forecolor="#707070" font-underline="false" />
<monthstyle backcolor="" forecolor="#000000" font-underline="false" />
</cc1:datepicker>
<asp:Label ID="Label5" CssClass="txtSelect" runat="server" Text="End Date" />
<cc1:datepicker ID="endDatePicker" runat="server" Width="70px" PaneWidth="150px" SelectedDate="1/1/2020">
<panetablestyle bordercolor="#707070" borderwidth="1px" borderstyle="Solid" />
<paneheaderstyle backcolor="#0099FF" />
<titlestyle forecolor="White" font-bold="true" />
<nextprevmonthstyle forecolor="White" font-bold="true" />
<nextprevyearstyle forecolor="#E0E0E0" font-bold="true" />
<dayheaderstyle backcolor="#E8E8E8" />
<todaystyle backcolor="#FFFFCC" forecolor="#000000" font-underline="false" bordercolor="#FFCC99" />
<alternatemonthstyle backcolor="#F0F0F0" forecolor="#707070" font-underline="false" />
<monthstyle backcolor="" forecolor="#000000" font-underline="false" />
</cc1:datepicker>
<asp:Button ID="RetrieveButton" runat="server" Text="Retrieve" OnClick="RetrieveButton_Click" />
<asp:GridView ID="creditRateGridView" runat="server"
DataSourceID="creditRateObjectDataSource"
AllowPaging="true"
AllowSorting="true"
PageSize="10"
Width="900"
AutoGenerateColumns="False"
DataKeyNames="EFFECTIVE_DATE"
GridLines="Both"
EnableSortingAndPagingCallbacks="true">
<Columns>
<asp:BoundField DataField="EFFECTIVE_DATE" HeaderText="Effective Date"
ItemStyle-HorizontalAlign="Right" ReadOnly="True"
SortExpression="EFFECTIVE_DATE" DataFormatString="{0:d}" />
<asp:BoundField DataField="REFERENCE_DATE" HeaderText="Reference Date"
ItemStyle-HorizontalAlign="Right" ReadOnly="True"
SortExpression="REFERENCE_DATE" DataFormatString="{0:d}" />
<asp:BoundField DataField="GROSS_CREDIT_USED_RATE" HeaderText="Credit Rate"
ItemStyle-HorizontalAlign="Right" ReadOnly="True"
SortExpression="GROSS_CREDIT_USED_RATE" DataFormatString="{0:p}" />
<asp:BoundField DataField="ANNUALIZED_YIELD_ACTUAL_AVERAGE_RATE" HeaderText="Yield"
ItemStyle-HorizontalAlign="Right" ReadOnly="True"
SortExpression="ANNUALIZED_YIELD_ACTUAL_AVERAGE_RATE" DataFormatString="{0:p}" />
<asp:BoundField DataField="DURATION_USED_YEAR" HeaderText="Duration"
ItemStyle-HorizontalAlign="Right" ReadOnly="True"
SortExpression="DURATION_USED_YEAR" DataFormatString="{0:n2}" />
<asp:BoundField DataField="BOOK_VALUE_USED_AMOUNT" HeaderText="Book Value"
ItemStyle-HorizontalAlign="Right" ReadOnly="True"
SortExpression="BOOK_VALUE_USED_AMOUNT" DataFormatString="{0:c}" />
<asp:BoundField DataField="MARKET_VALUE_USED_AMOUNT" HeaderText="Market Value"
ItemStyle-HorizontalAlign="Right" ReadOnly="True"
SortExpression="MARKET_VALUE_USED_AMOUNT" DataFormatString="{0:c}" />
<asp:BoundField DataField="MV_BV_RATE" HeaderText="MV/BV Ratio"
ItemStyle-HorizontalAlign="Right" ReadOnly="True"
SortExpression="MV_BV_RATE" DataFormatString="{0:p}" />
</Columns>
<PagerSettings Mode="NumericFirstLast" FirstPageText="First" LastPageText="Last" />
<PagerStyle HorizontalAlign="Center" />
</asp:GridView>
<asp:ObjectDataSource ID="creditRateObjectDataSource" runat="server"
EnablePaging="true"
TypeName="AegonSVS.Restricted.CreditRateHistory"
SelectMethod="CreditRateSelectMethod"
StartRowIndexParameterName="startRowIndex"
MaximumRowsParameterName="maximumRows"
SortParameterName="sortExpression"
SelectCountMethod="CreditRateSelectCountMethod" />
</asp:Content>
public partial class CreditRateHistory : System.Web.UI.Page
{
private const int contractId = 1;
protected void Page_Load(object sender, EventArgs e)
{
Session.Add("startDateTime", startDatePicker.SelectedDate);
Session.Add("endDateTime", endDatePicker.SelectedDate);
}
public DataTable CreditRateSelectMethod(int startRowIndex, int maximumRows, string sortExpression)
{
var startDateTime = (DateTime)Session["startDateTime"];
var endDateTime = (DateTime)Session["endDateTime"];
DataTable dataTable = Sql.GetCreditRateHistoryPagedRecords(startDateTime,
endDateTime,
contractId,
startRowIndex,
maximumRows,
sortExpression,
null);
return dataTable;
}
public int CreditRateSelectCountMethod()
{
var startDateTime = (DateTime)Session["startDateTime"];
var endDateTime = (DateTime)Session["endDateTime"];
return Sql.GetCreditRateRowCount(startDateTime,
endDateTime,
contractId,
null);
}
protected void RetrieveButton_Click(object sender, EventArgs e)
{
// So something with this return? How?
IEnumerable dataSource = creditRateObjectDataSource.Select();
creditRateGridView.DataBind();
}
}
最佳答案
听起来您希望 ObjectDataSource
中的代码能够访问您的 Page 对象及其子对象。一般来说,这不是它的工作方式。 ObjectDataSource 中的代码需要独立存在,这意味着如果您需要使用几个日期过滤 SQL SELECT,则这些日期应作为参数发送。
如果您可以发布您的 ObjectDataSource 标记和 DAL 对象的类代码,我可以提供一个具体示例。
但是,您的问题的一般答案可以在这篇文章中找到:
MSDN: Using Parameters with the ObjectDataSource Control
将当前 Page
类用于 ObjectDataSource.TypeName
的问题在于,每次 ObjectDataSource
绑定(bind)时,它都会创建一个新的类实例来使用(有警告,但这在这里并不重要)。这就是为什么您不能读取控制值但可以读取 session 的原因。这就是为什么您不能依赖从 SelectMethod
中直接访问页面上的项目。您需要将查询参数作为 SelectMethod
的参数传入。
看起来您已经有一个名为 Sql
的类,其中包含(共享?)方法来进行数据访问。那是您的 creditRateObjectDataSource.TypeName
应该引用的类。然后有 creditRateObjectDataSource.SelectMethod
是 sql.GetCreditRateHistoryPagedRecords
,类似于这个例子:
<asp:ObjectDataSource ID="creditRateObjectDataSource" runat="server" EnablePaging="true"
TypeName="AegonSVS.Restricted.sql" SelectMethod="GetCreditRateHistoryPagedRecords"
StartRowIndexParameterName="startRowIndex" MaximumRowsParameterName="maximumRows"
SortParameterName="sortExpression" SelectCountMethod="CreditRateSelectCountMethod">
<SelectParameters>
<asp:ControlParameter Name="startDateTime" ControlID="startDatePicker" PropertyName="SelectedDate"
DbType="DateTime" />
<asp:ControlParameter Name="endDateTime" ControlID="endDatePicker" PropertyName="SelectedDate"
DbType="DateTime" />
<asp:Parameter Name="contractId" DefaultValue="1" DbType="Int32" />
</SelectParameters>
</asp:ObjectDataSource>
关于asp.net - ObjectDataSource 选择方法不能 'see' 任何其他控件的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5874564/