8 Answers, 1 is accepted
Hello Phil,
I am not sure what exactly is the scenario that you have on your end. I tested a simple XML binding scenario with RadDock in the EditItemTemplate, but the fields from that source are properly propagated to the RadDock.
Here you are code samples of the test case:
<
asp:FormView
runat
=
"server"
ID
=
"FormView1"
DataSourceID
=
"PeopleDataSource"
AllowPaging
=
"true"
DataMember
=
"Person"
>
<
ItemTemplate
>
<
div
><%# XPath ("Name/FirstName") %></
div
>
<
div
><%# XPath ("Name/LastName") %></
div
>
<
asp:LinkButton
ID
=
"Edit"
Text
=
"Edit"
CommandName
=
"Edit"
runat
=
"server"
/>
</
ItemTemplate
>
<
EditItemTemplate
>
<
telerik:RadDockZone
runat
=
"server"
>
<
telerik:RadDock
runat
=
"server"
>
<
ContentTemplate
>
<
asp:TextBox
ID
=
"FirstNameUpdateTextBox"
Text='<%# XPath ("Name/FirstName") %>'
runat="server" />
<
asp:TextBox
ID
=
"LastNameUpdateTextBox"
Text='<%# XPath ("Name/LastName") %>'
runat="server" />
<
asp:LinkButton
ID
=
"Update"
Text
=
"Update"
CommandName
=
"Update"
runat
=
"server"
/>
</
ContentTemplate
>
</
telerik:RadDock
>
</
telerik:RadDockZone
>
</
EditItemTemplate
>
</
asp:FormView
>
<
asp:XmlDataSource
ID
=
"PeopleDataSource"
runat
=
"server"
DataFile
=
"~/App_Data/people.xml"
/>
You can refer to this page for the XML: https://msdn.microsoft.com/en-us/library/494y92bs.aspx.
Regards,
Ianko
Telerik by Progress
Hi Lanko:
Try changing your form to include a Updating form event:
<
asp:FormView
runat
=
"server"
ID
=
"FormView1"
DataSourceID
=
"PeopleDataSource"
AllowPaging
=
"true"
DataMember
=
"Person"
OnItemUpdated
=
"FormView1_ItemUpdated"
>
...
Then add the following:
protected void FormView1_ItemUpdated(object sender, FormViewUpdatedEventArgs e)
{
StringBuilder _msg = new StringBuilder("[smd: ");
foreach (DictionaryEntry _entry in e.NewValues)
{
_msg.AppendFormat("{0}={1}, ", _entry.Key,
(_entry.Value != null ? _entry.Value.ToString() : ""));
}
int _i = 0;
}
Set a break point on _i I find that the dictionary is empty. And the form yellow screens with the following:
Specified method is not supported.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.NotSupportedException: Specified method is not supported.
Source Error:
An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.
Stack Trace:
[NotSupportedException: Specified method is not supported.]
System.Web.UI.DataSourceView.ExecuteUpdate(IDictionary keys, IDictionary values, IDictionary oldValues) +29
System.Web.UI.DataSourceView.Update(IDictionary keys, IDictionary values, IDictionary oldValues, DataSourceViewOperationCallback callback) +87
System.Web.UI.WebControls.FormView.HandleUpdate(String commandArg, Boolean causesValidation) +1136
System.Web.UI.WebControls.FormView.HandleEvent(EventArgs e, Boolean causesValidation, String validationGroup) +425
System.Web.UI.WebControls.FormView.OnBubbleEvent(Object source, EventArgs e) +89
System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +37
System.Web.UI.WebControls.FormViewRow.OnBubbleEvent(Object source, EventArgs e) +80
System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +37
System.Web.UI.WebControls.LinkButton.OnCommand(CommandEventArgs e) +121
System.Web.UI.WebControls.LinkButton.RaisePostBackEvent(String eventArgument) +156
System.Web.UI.WebControls.LinkButton.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +9665034
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1724
Phil
Hello Phil H.,
The same happens without the RadDock. Therefore, I am not exactly sure how this is relevant to the RadDock nested in the FormView. Also, the same exception is thrown without the RadDock.
Regards,Ianko
Telerik by Progress
Hi Lanko:
That is because your sample code does not have a Bind in the view. I missed that initially.
Phil
Hi Lanko:
I created a simple people class and an access class:
//
public
class
People
{
public
string
FirstName {
set
;
get
; }
public
string
LastName {
set
;
get
; }
public
string
Street {
set
;
get
; }
public
string
City {
set
;
get
; }
public
string
Region {
set
;
get
; }
public
string
ZipCode {
set
;
get
; }
public
string
Title {
set
;
get
; }
public
string
Description {
set
;
get
; }
}
public
class
PeopleAccess
{
public
List<People> GetData()
{
return
new
List<People>(){
new
People {
FirstName =
"Manoj"
,
LastName =
"Syamala"
,
Street =
"345 Maple St."
,
City =
"Redmond"
,
Region =
"WA"
,
ZipCode =
"01434"
,
Title =
"CEO"
,
Description =
"Develops company strategies."
},
new
People {
FirstName =
"Jared"
,
LastName =
"Stivers"
,
Street =
"123 Elm St."
,
City =
"Seattle"
,
Region =
"WA"
,
ZipCode =
"11223"
,
Title =
"Attorney"
,
Description =
"Reviews legal issues."
}
};
}
}
Then I change the UI to not use xml:
<
asp:FormView
runat
=
"server"
ID
=
"FormView1"
DataSourceID
=
"PeopleDataSource"
AllowPaging
=
"true"
OnItemUpdated
=
"FormView1_ItemUpdated"
>
<
ItemTemplate
>
<
div
><%# Eval( "FirstName") %></
div
>
<
div
><%# Eval( "LastName") %></
div
>
<
asp:LinkButton
ID
=
"Edit"
Text
=
"Edit"
CommandName
=
"Edit"
runat
=
"server"
/>
</
ItemTemplate
>
<
EditItemTemplate
>
<
telerik:RadDockZone
ID
=
"RadDockZone1"
runat
=
"server"
>
<
telerik:RadDock
ID
=
"RadDock1"
runat
=
"server"
>
<
ContentTemplate
>
<
asp:TextBox
ID
=
"TextBox1"
Text='<%# Bind( "FirstName") %>'
runat="server" />
<
asp:TextBox
ID
=
"TextBox2"
Text='<%# Bind( "LastName") %>'
runat="server" />
<
asp:LinkButton
ID
=
"Update"
Text
=
"Update"
CommandName
=
"Update"
runat
=
"server"
/>
</
ContentTemplate
>
</
telerik:RadDock
>
</
telerik:RadDockZone
>
</
EditItemTemplate
>
</
asp:FormView
>
<
asp:ObjectDataSource
ID
=
"PeopleDataSource"
runat
=
"server"
TypeName
=
"MMPA.MILC.WebUI.PeopleAccess"
DataObjectTypeName
=
"MMPA.MILC.WebUI.People"
SelectMethod
=
"GetData"
>
</
asp:ObjectDataSource
>
You will have to adjust the class names in the ObjectDataSource...
Now it fails to load the e.NewValues when the RadDock is used and load e.NewValues w/o the RadDock.
Phil
Hello Phil H.,
I am not sure whether you hit yet another exception, but in this scenario here you should add additionally the UpdateMehtod of the ObjectDataSource control.
Further, RadDock's template will not be able to send the bound values to the server as the ASP template mechanism changes the name attribute of the form fields.
You can fix that by having hidden inputs in the FormVie, which are programmatically updated when the textbox fields in the RadDock are changed.
Here you are a code example of this case:
<
asp:FormView
runat
=
"server"
ID
=
"FormView1"
DataSourceID
=
"PeopleDataSource"
AllowPaging
=
"true"
OnItemUpdated
=
"FormView1_ItemUpdated"
>
<
ItemTemplate
>
<
div
><%# Eval( "FirstName") %></
div
>
<
div
><%# Eval( "LastName") %></
div
>
<
asp:LinkButton
ID
=
"Edit"
Text
=
"Edit"
CommandName
=
"Edit"
runat
=
"server"
/>
</
ItemTemplate
>
<
EditItemTemplate
>
<
asp:HiddenField
ID
=
"hiddenFirstName"
runat
=
"server"
Value='<%# Bind( "FirstName") %>' ClientIDMode="Static" />
<
asp:HiddenField
ID
=
"hiddenLastName"
runat
=
"server"
Value='<%# Bind( "LastName") %>' ClientIDMode="Static" />
<
telerik:RadDockZone
ID
=
"RadDockZone1"
runat
=
"server"
>
<
telerik:RadDock
ID
=
"RadDock1"
runat
=
"server"
OnClientLoad
=
"OnClientLoad"
>
<
ContentTemplate
>
<
asp:TextBox
ID
=
"TextBoxFirstName"
Text='<%# Bind( "FirstName") %>'
runat="server" CssClass="TextBoxFirstName" />
<
asp:TextBox
ID
=
"TextBoxLastName"
Text='<%# Bind( "LastName") %>'
runat="server" CssClass="TextBoxLastName" />
<
asp:LinkButton
ID
=
"LinkButton1"
Text
=
"Update"
CommandName
=
"Update"
runat
=
"server"
/>
</
ContentTemplate
>
</
telerik:RadDock
>
</
telerik:RadDockZone
>
</
EditItemTemplate
>
</
asp:FormView
>
<
script
>
function OnClientLoad() {
var $ = $telerik.$;
var TextBoxFirstName = $(".TextBoxFirstName"),
TextBoxLastName = $(".TextBoxLastName"),
HiddenFirstName = $("#hiddenFirstName"),
HiddenLastName = $("#hiddenLastName");
TextBoxFirstName.change(function (ev) {
HiddenFirstName.val($(TextBoxFirstName).val());
})
TextBoxLastName.change(function (ev) {
HiddenLastName.val($(TextBoxLastName).val());
})
}
</
script
>
<
asp:ObjectDataSource
ID
=
"PeopleDataSource"
runat
=
"server"
TypeName
=
"WebUISite.PeopleAccess"
DataObjectTypeName
=
"WebUISite.People"
SelectMethod
=
"GetData"
UpdateMethod
=
"UpdateData"
></
asp:ObjectDataSource
>
Ianko
Telerik by Progress
Hi Lanko:
The bound items need to go from the form updating event to the data source updating event, but the form updating event could not find the controls/values. I already know about needing the data source event.
So your work-around is binding to hidden fields. Not good in my opinion.
Phil
Hello Phil H.,
I agree with you on this, however, it is how templates in ASP.NET Web Forms work. Putting a form field in a template will update the name attribute of this field with additional values (the ID of the parent control). This is the native way for Web Forms to handle ViewState.
Therefore, having a template that nests an additional template, where the update source comes from will not update the state of the bound datasource to the original control. This is because the ViewState cannot handle this situation. Thus, workarounds such as the proposed one are needed for such complex cases when nesting templates.
Regards,Ianko
Telerik by Progress