ASP.NET: CollapsiblePanelExtender doesn't work with UserControl - asp.net

Iam trying to use a UserControl named CheckBoxControl as value for the ExpandControlID/CollapseControlID attributes of the CollapsiblePanelExtender. It works fine when I use a normal CheckBox instead.
<uc:CheckBoxControl ID="ucHaftpflicht" runat="server" OnCheckedChanged="UpdateStatus" ControlLabel="Haftpflicht" />
<asp:Panel ID="HaftpflichtPanel" runat="server">
...
</asp:Panel>
<asp:CollapsiblePanelExtender ID="CollapsiblePanelExtender" runat="server" CollapseControlID="ucHaftpflicht.CheckBox" ExpandControlID="ucHaftpflicht.CheckBox" TargetControlID="HaftpflichtPanel" />
When I run the site, most ajax controls on my site disappear and I get following errors in firefox script error console:
Fehler: Sys.InvalidOperationException: Handler was not added through the Sys.UI.DomEvent.addHandler method.
Fehler: Sys.ArgumentException: Failed to find element "ucHaftpflicht.CheckBox"
Parameter name: CollapseControlID

Expose the checkbox through a getter in your UserControl, and in the code-behind of the page assign the CollapsiblePanelExtender collapse/expand control IDs to ucHaftpflicht.MyCheckBox.ClientID

Related

Gridview inside of form running at server throws "'GridView' must be placed inside aform tag with runat=server"

I've seen a looot of questions about this and I've tried to overload/override VerifyRenderingInServerForm method and it isn't helping (the compiler complains if I try overrides).
To be sure:
In the master page, we have:
<form id="form1" runat="server">
so it definitely is inside a form/server tag.
The gridview has:
<asp:GridView
ItemStyle-CssClass="Item"
ID="grdInfo"
runat="server"
CssClass="grdCss"
Width="100%"
CellPadding="3"
AutoGenerateColumns="false"
HeaderStyle-CssClass="Header"
RowStyle-CssClass="Item"
AlternatingRowStyle-CssClass="AltItem"
AllowSorting="false"
AllowPaging="false">
....
Unlike other people, I'm not trying to render excel. I am, however, attempting to bind to a enumerable collection:
Public Class colInfoSet
Inherits CollectionBase
We use this type of object elsewhere without problems.
I just found out what the problem is. When the master page and child page/controls are loaded, the grid isn't rendered because it has no rows. The grid is then retrieved via ajax and then populated.
Since it was not rendered when the page was rendered, it cannot be added to the control tree.
Hence it doesn't work.
The solution I will be going with is to use a repeater instead.

UserControl DirectMethod Not firing in Ext.net

HI, I am Loading one UserControl(Which has the GridPanel in it ) into
tabPanel.
But when i click on Gridpanel Edit Command Button the Event at Server
side method not working and showing the Exception like
Exception Details: System.Web.HttpException: The control with ID
'id8b177c82adb2e925' not found.
My Code here is
For the userControl : the .ascx code is
<%# Control Language="C#" AutoEventWireup="true" CodeBehind="GridPanelUserControl.ascx.cs" Inherits="Ext_PracticeExamples.GridPanelUserControl" %>
<ext:GridPanel ID="gpEmployeeList" runat="server" StripeRows="true" Title="Employee List" Layout="FitLayout"
Width="620" Height="400" AutoExpandColumn="FirstName">
<Store>
.....
</Store>
<ColumnModel ID="ColumnModel1" runat="server">
<Columns>
<ext:ImageCommandColumn ID="imgSettings" runat="server" Text="Settings" Resizable="false">
<Commands>
<ext:ImageCommand Icon="BasketEdit" Style="text-align: center" CommandName="Settings">
</ext:ImageCommand>
</Commands>
<Listeners>
<Command Handler=" #{DirectMethods}.fnDisplaySettings(record.data.Company,record.data.Price,record.data.Change);" />
</Listeners>
</ext:ImageCommandColumn>
</Columns>
</ColumnModel>
and the Corresponding .cs Class file method which is not firing.
[DirectMethod]
public void fnDisplaySettings(string name, double X, double Y)
{
// ..some Operation....
Response.Redirect("~/_Default.aspx");
}
while Observing the Source page in webBrowser i find that the Controls have
different Id so that Corresponding function not displaying.If i give
"ClientIdMode=static" it gives me the Unique Id problem when i load
the same control in the page. If i Use this code in Single page
without UserControl it's working fine.
What should i do Invoke the server Side Method.
Thank you
I guess you render a user control on the fly during one request and doesn't recreate it during another request, therefore Ext.NET can't find its DirectMethod, because there is no user control instance on server.
Possible solutions are:
Recreate a user control during each request. Here is a related discussion on the Ext.NET forums.
Setting up a DirectMethod's handler in, for example, a WebService (asmx) or an HTTP handler (ashx), and call it via URL. Such a call won't require a user control instance. Here are examples.
http://examples.ext.net/#/Events/DirectMethods/WebService/
http://examples.ext.net/#/Events/DirectEvents/WebService/
The disadvantage of this approach is the fact that you won't be able to access a user control's controls in a WebService or an HTTP handler. All required things should be submitted from a page as extra parameters of a request.
Placing a DirectMethod to the page.

Usercontrol errors in asp.net

Is there a way to universally force a page to error when a usercontrol raises an error? For example, if you write code that will create an error in a usercontrol, like this:
<asp:Label ID="lbl" runat="server" Text='<%# string.Format(("") %>' />
The page will still load like everything is working, but the portion of the page that the usercontrol occupies will contain the error "... ) expected." I want the page to actually error like it normally would if that bad code were on a normal .aspx page. Thanks in advance for any advice.
See How do I catch an exception raised on my ASCX control (not the code-behind)? for some details on this. One suggested solution involves creating an event in your user control that is fired if an exception is caught during the control's RenderChildren method. Then, your parent aspx page can handle the event raised in the ascx.

ASP.net scriptmanager and AJAX control

im making a username availability check in ASP.net using ajax updatepanel, but i keep getting the following error
The control with ID 'UserNameUP' requires a ScriptManager on the page. The ScriptManager must appear before any controls that need it.]
im using the create user wizard, to create a new user but i want to check if the user already exists, i have the following code in the aspx file
<asp:UpdatePanel runat="server" ID="UserNameUP">
<ContentTemplate>
<asp:TextBox ID="UserName" runat="server" Width="200px" AutoPostBack="true" OnTextChanged="Username_Changed"></asp:TextBox></ContentTemplate> </asp:UpdatePanel><br />
but i keep getting that error, can any one help
thanks
Before your update panel, make sure you have a scriptmanager:
<asp:ScriptManager id="ScriptManager1" runat="server">
</asp:ScriptManager>
Do you have a script manager inside a master page? That can cause the "Only one instance of a ScriptManager can be added to the page" error?
Or, if its DNN, there is one on each "page" by default.

How to have a link in one placeholder open a ModalPopup in a different placeholder?

I have a page with different placeholders. In one of them, I have a link that I want to open a modal popup in a second placeholder (using the ajaxtoolkit ModalPopupExtender) :
<asp:Content ID="content1" ContentPlaceHolderID="placeholder1" Runat="Server">
<asp:LinkButton ID="link" runat="server" Text="Popup link" />
</asp:Content>
<asp:Content ID="content2" ContentPlaceHolderID="placeholder2" Runat="Server">
<asp:Panel ID="panel" runat="server" Text="Popup content" />
<ajaxToolkit:ModalPopupExtender ID="popup" runat="sever"
TargetControlID="link"
PopupControlID="panel"
/>
</asp:Content>
When doing as above, it fires me an exception, saying that popup cannot find link (which I understand, because they are in two different placeholders).
How can I make this work ? I can think of something find FindControl in the code behind, but I don't really like to use this function, as it is pretty computationally expensive (especially with my nested layout).
One issue is that your TargetControlID and PopupControlIDs are reversed. TargetControlID is the ID of the item that you want to 'Modal Pop', in your case that would be Panel1. The PopupControlID is the ID of the control that would trigger the ModalPopup, in your case that would be "Link"
But you still have a few options if that doesn't work, I have fired a modal located in a different update panel before using the method below. Though not the exact same issue, this workaround may help you (I am assuming you have a script manager on your page).
Create a hidden element in Content2 with ID="hiddenLink"
Set your ModalExtender PopupControlID="hiddenLink"
In the codeBehind for "link" in content1, add an onClick event with the following
ModalPopup1.show()
If you are using updatePanels, this will cause the ModalPopup to display in AJAX fashion without page refresh.But you would still get a full postback worht of data between the client and the server.
Method 2, you could use a javascript function to show to Modal as well. Add a behaviorID="MyModal1" (or whatever you want to call it) to your Modalpopup definition. Then change your link:
<asp:LinkButton ID="link" runat="server" Text="Popup link" OnClientClick="$get('MyModal1').show(); return false;"/>
Note: The return false in the above example prevents the .NET page from performing a postback.

Resources