ObjectDataSource paging and extra parameters - c#

I'm using an ObjectDataSource to sort/page/filter as below:
<asp:ObjectDataSource
ID="odsCompaniesIndex" runat="server" EnablePaging="true"
SelectMethod="GetCompaniesSubset"
StartRowIndexParameterName="startRowIndex"
MaximumRowsParameterName="maximumRows"
SelectCountMethod="GetCompaniesCount"
SortParameterName="sortExpression"
TypeName="Company">
<SelectParameters>
<asp:ControlParameter ControlID="ddlStatus"
ConvertEmptyStringToNull="true"
DbType="Boolean" PropertyName="SelectedValue" Name="status" />
</SelectParameters>
</asp:ObjectDataSource>
The gridview consuming the ObjectDataSource:
<asp:GridView ID="gvCompanyIndex" AutoGenerateColumns="true" runat="server" DataSourceID="odsCompaniesIndex"
AllowPaging="true" DataKeyNames="company_id" AllowSorting="true">
</asp:GridView>
I want to pass in a number of parameters like the one above into SelectParameters. The method call 'GetCompaniesSubset' executes but on the return I get the following error:
ObjectDataSource 'odsCompaniesIndex'
could not find a non-generic method
'GetCompaniesCount' that has
parameters: status.
My SelectMethod is:
public DataSet GetCompaniesSubset(
int startRowIndex, int maximumRows, string sortExpression, bool status)
{...}
How do you allow the SelectMethod to utilise StartRowIndexParameterName/MaximumRowsParameterName and any extra parameters?
Thanks

The problem is that GetCompaniesCount does not have status parameter, not GetCompaniesSubset.

Related

How to get total rows count of grid view while data source is domain data source with query parameters and paging is also enabled?

Code as below. I'm able to get the IQueryable type of collection, but I also want to get the total rows count.
<asp:GridView ID="GridView1" runat="server" AllowPaging="True" DataSourceID="dsBiz"
AutoGenerateColumns="False" ShowHeader="false"
DataKeyNames="PinCodeId" PageSize="5" OnDataBound="GV_DataBound">
</asp:GridView>
<asp:DomainDataSource ID="dds" runat="server" QueryName="GetPinCodeInfoList" DomainServiceTypeName="postoffice.Controller.Biz">
<QueryParameters>
<asp:ControlParameter ControlID="ddlState" Name="stateId" PropertyName="SelectedValue" />
<asp:ControlParameter ControlID="ddlDistrict" Name="district" PropertyName="SelectedValue" />
<asp:ControlParameter ControlID="ddlTaluka" Name="taluk" PropertyName="SelectedValue" />
</QueryParameters>
</asp:DomainDataSource>
For that I added count value in HttpContext before the method" GetPinCodeInfoList" returns the value and then used where it is required.
` //Added Count in the context
HttpContext.Current.Items.Add("Count", count);
//update that value wherever required
HttpContext.Current.Items["Count"] = count;
//Access that value anywhere in same context
String countString = HttpContext.Current.Items["Count"].ToString();`

ObjectDataSource RemoveByID not working, issue with DataKeyNames?

Using ASP.NET/C#/nHibernate architecture - I have a GridView with an ObjectDataSource and am having problems getting the delete method to work.
When I simply use the Remove(T entity) function declared in my service layer (which then calls down to my nHibernate repository), the GridView_RowDeleting() method gets called, followed by ObjectDataSource_Deleting(), and then the service layer function is invoked and the business object is properly deleted.
However, when I try to use the RemoveByID(int ID) function, after the GridView_RowDeleting() and ObjectDataSource_Deleting() methods are called, the service layer is never being invoked.
I think this has something to do with the ObjectDataSource.DeleteParameters, but I can't seem to get it right.
Below is the code snippet for the GridView and ObjectDataSource. As you can see, I have the business object's primary key pkChapter7ID listed in the GridView's DataKeyNames:
<asp:GridView ID="gvChapter7" runat="server" DataSourceID="odsChapter7" DataKeyNames="pkChapter7ID">
<Columns>
<asp:BoundField DataField="pkChapter7ID" HeaderText="pkChapter7ID" SortExpression="pkChapter7ID"/>
...
</Columns>
</asp:GridView>
<asp:ObjectDataSource ID="odsChapter7" runat="server"
DeleteMethod="RemoveByID" OldValuesParameterFormatString="original_{0}"
SelectMethod="FindAllForProjectID" TypeName="CLS.Services.Chapter7Service">
<DeleteParameters>
<asp:Parameter Name="ID" Type="Int32" />
</DeleteParameters>
<SelectParameters>
<asp:SessionParameter Name="ID" SessionField="ProjectID" Type="Int32" />
</SelectParameters>
</asp:ObjectDataSource>
And the relevant portion of my generic service layer (calls down the nHibernate repository, which is working fine once I get there):
[DataObjectMethod(DataObjectMethodType.Delete, false)]
public virtual void Remove(T entity)
{
_repository.Remove(entity);
}
[DataObjectMethod(DataObjectMethodType.Delete, true)]
public virtual void RemoveByID(int ID)
{
T entity = FindBy(ID);
if (entity != null)
_repository.Remove(entity);
}
I have tried setting DeleteParameters in the _RowDeleting method:
protected void gvChapter7_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
odsChapter7.DeleteParameters["ID"].DefaultValue = e.Keys["pkChapter7ID"].ToString();
}
As well as numerous ways of setting up the ObjectDataSource control parameter in the aspx page, such as:
<DeleteParameters>
<asp:ControlParameter ControlID="gvChapter7" Name="ID" PropertyName="SelectedDataKey" Type="Int32" />
</DeleteParameters>
Can anyone see what I am missing?

LinqDataSource Where Parameter

I have the below query on my aspx page that works:
<asp:LinqDataSource ID="LinqDataSource1" runat="server"
ContextTypeName="InventoryDataContext"
EntityTypeName="" TableName="V_InventoryForDisplays"
Where="ConfiguredCarId == #ConfiguredCarId">
<WhereParameters>
<asp:Parameter DefaultValue="2827" Name="ConfiguredCarId" Type="Int32" />
</WhereParameters>
</asp:LinqDataSource>
I need to change the Where clause to use a Contains statement. I have an auto-propertyĐ–
public IEnumerable<int> ConfiguredCarIds { get; set; }
within the same class that I would like to use
so what is the proper syntax to do this:
Where="ConfiguredCarIds.Contains (ConfiguredCarId)"
Thanks!
Try Where="ConfiguredCarId.Contains(#ConfiguredCarId)"

Skip setting value of sql parameter in SqlDataSource in WebForm

I am making a WebForm in asp.net and I want to display gridview with data from asp:SqlDataSource
My problem becomes when I try to skip (pass null) values for some of the Parameters.
Here is some snippets of my code
In aspx file sqldatasource looks like
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:ApplicationServices %>"
SelectCommand="art_bat_art" SelectCommandType="StoredProcedure">
<SelectParameters>
<asp:Parameter Name="art_naz" DefaultValue="HLA" ConvertEmptyStringToNull="true" Type="String" />
<asp:Parameter Name="art_sifra" DbType="String" Direction="Input"/>
<asp:Parameter Name="vrsta_id" DefaultValue="3" ConvertEmptyStringToNull="true" Type="Int32" />
<asp:Parameter Name="podvrsta_id" DefaultValue="13" ConvertEmptyStringToNull="true"
Type="Int32" />
<asp:Parameter Name="podgrupa2" DefaultValue="1365" ConvertEmptyStringToNull="true" Type="Int32" />
<asp:Parameter Name="podosobine" DefaultValue="1:9241" ConvertEmptyStringToNull="true"
Type="String" />
<asp:Parameter Name="podosobineOR" DefaultValue="true" ConvertEmptyStringToNull="true"
Type="Boolean" />
</SelectParameters>
My grid looks like this:
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
DataKeyNames="id" DataSourceID="SqlDataSource1">
And troubles comes in code behind
One of parameters for my stored procedure is optional, If i pass it as null in SQL the stored procedure is
going to execute anyway.
I am trying to skip and pass that parameter as follows
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click1(object sender, EventArgs e)
{
SqlDataSource1.SelectParameters["art_sifra"].DefaultValue = DBNull.Value; //Cannot implicitly convert type
SqlDataSource1.SelectParameters["art_sifra"].DefaultValue = System.Data.SqlTypes.SqlString.Null; //Cannot implicitly convert type
SqlDataSource1.SelectParameters["art_sifra"].DefaultValue = System.Data.SqlTypes.SqlString.Null.ToString(); //IT compiles but i get NULL as text in SQL
//IF I Just skip seting of this parametar, My SqlDataSource won't call stored proce
SqlDataSource1.SelectParameters["art_sifra"].DefaultValue = string.Empty; //Again no execution of stored proce
//Even if I call SqlDataSource1.DataBind(); //nothing cames to sql
GridView1.DataBind();
}
}
You'll have to edit your SQL (or stored proc) to be able to handle an optional parameter.
ie: if you have:
SELECT blah FROM yourTable WHERE art_sifra = #art_sifra
change it to:
SELECT blah FROM yourTable WHERE (art_sifra = #art_sifra OR #art_sifra = '')
and then just change ConvertEmptyStringToNull="false" and set your select parameter to "":
SqlDataSource1.SelectParameters["art_sifra"].DefaultValue = "";
Also need to set CancelSelectOnNullParameter="false" on your datasource.
DBNull.Value; //Cannot implicitly convert type
Have you tried casting it? E.g.
DBNull.Value.Tostring()

ObjectDataSource could not find a non-generic method

I have this ASP.NET code:
<asp:DropDownList
ID="ddlBrokers"
runat="server"
AutoPostBack="true"
DataSourceID="srcBrokers"
DataTextField="broker"
DataValueField="brokerId"
/>
<asp:ObjectDataSource
id="srcBrokers"
TypeName="DatabaseComponent.DBUtil"
SelectMethod="GetBrokers"
runat="server">
</asp:ObjectDataSource>
My DAL code:
public DataTable GetBrokers(bool? hasImport=null)
{
SqlCommand cmd = new SqlCommand("usp_GetBrokers");
if (hasImport.HasValue)
cmd.Parameters.AddWithValue("#hasImport", hasImport);
return FillDataTable(cmd, "brokers");
}
When the form loads I get this error:
ObjectDataSource 'srcBrokers' could not find a non-generic method 'GetBrokers' that has no parameters.
Is it my optional parameter that is causing the problem? How can I workaround this? Is it possible to have optional parameters with declarative ASP.NET code?
add method:
public DataTable GetBrokers() {
return GetBrokers(null);
}
and check is it works?
You can use SelectParameters like this:
<asp:ObjectDataSource id="srcBrokers" TypeName="DatabaseComponent.DBUtil" SelectMethod="GetBrokers" runat="server">
<SelectParameters>
<asp:Parameter Name="hasImport" Type="Empty" />
<SelectParameters>
</asp:ObjectDataSource>

Categories

Resources