Hi,
We are trying to resolve a problem from two days now : We are unable to upload files in the RadGrid from a RadUpload.
We found some resolution sample on your forum but none of them could work on our solution because of the UpdatePanel.
Some explanation of the structure of our application :
UpdatePanel containing multiple WebControls => our RadGrid is in one of them.
We couldn't change now the structure of this application : We couldn't remove the UpdatePanel
I took out the code making us crazy, to put it in a project sample with to retrieve the error.
The code behind code :
Does someone have a solution ??
Thank you for your help
We are trying to resolve a problem from two days now : We are unable to upload files in the RadGrid from a RadUpload.
We found some resolution sample on your forum but none of them could work on our solution because of the UpdatePanel.
Some explanation of the structure of our application :
UpdatePanel containing multiple WebControls => our RadGrid is in one of them.
We couldn't change now the structure of this application : We couldn't remove the UpdatePanel
I took out the code making us crazy, to put it in a project sample with to retrieve the error.
<
asp:Content
ID
=
"__functionLeft"
ContentPlaceHolderID
=
"MainContent"
runat
=
"Server"
>
<
asp:UpdatePanel
ID
=
"__upDatePanel"
runat
=
"server"
>
<
ContentTemplate
>
<
telerik:RadCodeBlock
ID
=
"RadCodeBlock1"
runat
=
"server"
>
<
script
type
=
"text/javascript"
>
//
<![CDATA[
//On insert and update buttons click temporarily disables ajax to perform upload actions
function conditionalPostback(sender, eventArgs) {
var theRegexp = new RegExp("\.UpdateButton$|\.PerformInsertButton$", "ig");
if (eventArgs.get_eventTarget().match(theRegexp)) {
var upload = $find(window['UploadId']);
//AJAX is disabled only if file is selected for upload
if (upload.getFileInputs()[0].value != "") {
eventArgs.set_enableAjax(false);
}
}
}
function validateRadUpload(source, e) {
e.IsValid = false;
var upload = $find(source.parentNode.getElementsByTagName('div')[0].id);
var inputs = upload.getFileInputs();
for (var i = 0; i < inputs.length; i++) {
//check for empty string or invalid extension
if (inputs[i].value != "" && upload.isExtensionValid(inputs[i].value)) {
e.IsValid = true;
break;
}
}
}
// ]]>
</
script
>
</
telerik:RadCodeBlock
>
<
telerik:RadGrid
ID
=
"__linksRadGrid"
runat
=
"server"
AllowMultiRowEdit
=
"false"
ShowStatusBar
=
"true"
GridLines
=
"None"
AllowPaging
=
"False"
AllowAutomaticUpdates
=
"false"
AllowAutomaticInserts
=
"false"
OnPreRender
=
"LinksGridView_PreRender"
OnItemCreated
=
"LinksGridView_ItemCreated"
OnNeedDataSource
=
"LinksRadGrid_NeedDataSource"
OnInsertCommand
=
"LinksRadGrid_InsertCommand"
OnUpdateCommand
=
"LinksRadGrid_UpdateCommand"
OnDeleteCommand
=
"LinksRadGrid_DeleteCommand"
OnItemDataBound
=
"LinksRadGrid_ItemDataBound"
OnItemCommand
=
"LinksRadGrid_ItemCommand"
OnEditCommand
=
"LinksRadGrid_EditCommand"
AllowSorting
=
"true"
Skin
=
"Transparent"
Width
=
"450px"
>
<
MasterTableView
AutoGenerateColumns
=
"False"
DataKeyNames
=
"IdAttachment"
CommandItemDisplay
=
"Bottom"
>
<
PagerStyle
Mode
=
"NextPrevAndNumeric"
/>
<
CommandItemTemplate
>
<
div
style
=
"padding: 5px 5px;"
>
<
asp:ImageButton
ID
=
"imgInsert"
runat
=
"server"
CommandName
=
"InitInsert"
AlternateText
=
"Insert New Record"
ToolTip
=
"Insert New Record"
/>
<
asp:ImageButton
ID
=
"imgRefresh"
runat
=
"server"
CommandName
=
"RebindGrid"
AlternateText
=
"Refresh the grid"
ToolTip
=
"Refresh the grid"
/>
</
div
>
</
CommandItemTemplate
>
<
Columns
>
<
telerik:GridEditCommandColumn
ButtonType
=
"ImageButton"
UniqueName
=
"EditAttachmentLinks"
ItemStyle-Width
=
"30px"
ItemStyle-HorizontalAlign
=
"Center"
/>
<
telerik:GridBoundColumn
DataField
=
"Title"
DataType
=
"System.String"
HeaderText
=
"Title"
SortExpression
=
"Title"
UniqueName
=
"Title"
>
</
telerik:GridBoundColumn
>
<
telerik:GridBoundColumn
DataField
=
"Description"
DataType
=
"System.String"
HeaderText
=
"Description"
SortExpression
=
"Description"
UniqueName
=
"Description"
>
</
telerik:GridBoundColumn
>
<
telerik:GridBoundColumn
DataField
=
"AttachmentType"
DataType
=
"System.String"
HeaderText
=
"AttachmentType"
SortExpression
=
"AttachmentType"
UniqueName
=
"AttachmentType"
Display
=
"false"
>
</
telerik:GridBoundColumn
>
<
telerik:GridBoundColumn
DataField
=
"Url"
DataType
=
"System.String"
HeaderText
=
"Url"
SortExpression
=
"Url"
UniqueName
=
"URL"
Display
=
"false"
>
</
telerik:GridBoundColumn
>
<
telerik:GridTemplateColumn
HeaderText
=
"Type"
UniqueName
=
"Type"
HeaderStyle-HorizontalAlign
=
"Center"
ItemStyle-HorizontalAlign
=
"Center"
>
<
ItemTemplate
>
<
asp:ImageButton
ID
=
"__attachedTypeImageButton"
runat
=
"server"
/>
</
ItemTemplate
>
</
telerik:GridTemplateColumn
>
<
telerik:GridButtonColumn
CommandName
=
"Delete"
ButtonType
=
"ImageButton"
UniqueName
=
"DeleteAttachmentLinks"
ConfirmText
=
"Delete this record?"
ConfirmDialogType
=
"RadWindow"
ConfirmTitle
=
"Delete"
ItemStyle-Width
=
"30px"
ItemStyle-HorizontalAlign
=
"Center"
/>
</
Columns
>
<
EditFormSettings
EditFormType
=
"Template"
>
<
EditColumn
UniqueName
=
"EditCommandColumn1"
>
</
EditColumn
>
<
FormTemplate
>
<
table
cellspacing
=
"2"
cellpadding
=
"1"
width
=
"100%"
border
=
"0"
>
<
tr
>
<
td
>
<
asp:Label
ID
=
"__titleLabel"
runat
=
"server"
Text
=
"Title"
>
</
asp:Label
>
</
td
>
<
td
>
<
asp:TextBox
ID
=
"__titleTextBox"
runat
=
"server"
Width
=
"100px"
Text='<%# Bind("Title") %>' >
</
asp:TextBox
>
<
span
style
=
"color:Red; font-weight:bold"
>*</
span
>
<
br
/>
<
asp:RequiredFieldValidator
ID
=
"__titleTextBoxRFValidator"
runat
=
"server"
ControlToValidate
=
"__titleTextBox"
Display
=
"Dynamic"
ErrorMessage
=
"Please, enter a title!"
SetFocusOnError
=
"true"
/>
</
td
>
</
tr
>
<
tr
>
<
td
>
<
asp:Label
ID
=
"__decriptionLabel"
runat
=
"server"
Text
=
"Description"
>
</
asp:Label
>
</
td
>
<
td
>
<
asp:TextBox
ID
=
"__decriptionTextBox"
runat
=
"server"
Width
=
"100px"
TextMode
=
"MultiLine"
Rows
=
"4"
Text='<%# Bind("Description") %>'>
</
asp:TextBox
>
<
span
style
=
"color:Red; font-weight:bold"
>*</
span
>
<
br
/>
<
asp:RequiredFieldValidator
ID
=
"__decriptionTextBoxRFValidator"
runat
=
"server"
ControlToValidate
=
"__decriptionTextBox"
Display
=
"Dynamic"
ErrorMessage
=
"Please, enter a description!"
SetFocusOnError
=
"true"
/>
</
td
>
</
tr
>
<
tr
>
<
td
>
<
asp:Label
ID
=
"__URLLabel"
runat
=
"server"
Text
=
"URL"
>
</
asp:Label
>
</
td
>
<
td
>
<
asp:TextBox
ID
=
"__urlTextBox"
runat
=
"server"
Width
=
"255px"
Text='<%# Bind("URL") %>' >
</
asp:TextBox
>
</
td
>
</
tr
>
<
tr
>
<
td
colspan
=
"2"
>
<
asp:Label
ID
=
"__orLabel"
runat
=
"server"
Text
=
"or"
>
</
asp:Label
>
</
td
>
</
tr
>
<
tr
>
<
td
>
<
asp:Label
ID
=
"__fileUploadLabel"
runat
=
"server"
Text
=
"File"
>
</
asp:Label
>
</
td
>
<
td
>
<
div
id
=
"__fileUploadDiv"
runat
=
"server"
>
<
telerik:RadUpload
ID
=
"__fileUpload"
runat
=
"server"
ControlObjectsVisibility
=
"None"
MaxFileInputsCount
=
"1"
/>
</
div
>
</
td
>
</
tr
>
<
tr
>
<
td
align
=
"right"
colspan
=
"2"
>
<
asp:Button
ID
=
"btnUpdate"
runat
=
"server"
Text='<%# (Container is GridEditFormInsertItem) ? "Insert" : "Update" %>'
CommandName='<%# (Container is GridEditFormInsertItem) ? "PerformInsert" : "Update" %>'
CausesValidation="True" >
</
asp:Button
>
<
asp:Button
ID
=
"btnCancel"
runat
=
"server"
Text
=
"Cancel"
CausesValidation
=
"False"
CommandName
=
"Cancel"
>
</
asp:Button
>
</
td
>
</
tr
>
</
table
>
</
FormTemplate
>
</
EditFormSettings
>
</
MasterTableView
>
</
telerik:RadGrid
>
</
ContentTemplate
>
</
asp:UpdatePanel
>
<
script
type
=
"text/javascript"
>
function LinksFileUpload_OnChange(clientidTextBox) {
document.getElementById(clientidTextBox).value = "";
}
function LinksUrlTextBox_OnChange(clientIdDIVFileUpload) {
//We couldn't change the input file value, so we reset the DIV container
document.getElementById(clientIdDIVFileUpload).innerHTML = document.getElementById(clientIdDIVFileUpload).innerHTML;
}
</
script
>
</
asp:Content
>
The code behind code :
using
System;
using
System.Collections.Generic;
using
System.Linq;
using
System.Web;
using
System.Web.UI;
using
System.Web.UI.WebControls;
using
System.Data;
using
System.ComponentModel;
using
Telerik.Web.UI;
using
System.Text;
using
System.Web.UI.HtmlControls;
using
System.IO;
public
class
ListHelper {
public
static
DataTable ToDataTable<T>(IList<T> data) {
PropertyDescriptorCollection props = TypeDescriptor.GetProperties(
typeof
(T));
DataTable table =
new
DataTable();
for
(
int
i = 0; i < props.Count; i++) {
PropertyDescriptor prop = props[i];
table.Columns.Add(prop.Name, prop.PropertyType);
}
object
[] values =
new
object
[props.Count];
foreach
(T item
in
data) {
for
(
int
i = 0; i < values.Length; i++) {
values[i] = props[i].GetValue(item);
}
table.Rows.Add(values);
}
return
table;
}
}
public
class
GWAttachment {
#region Accessor
private
string
_title;
public
string
Title {
get
{
return
this
._title; }
set
{
this
._title = value; }
}
private
string
_description;
public
string
Description {
get
{
return
this
._title; }
set
{
this
._title = value; }
}
private
string
_url;
public
string
Url {
get
{
return
this
._url; }
set
{
this
._url = value; }
}
private
string
_fileName;
public
string
FileName {
get
{
return
this
._fileName; }
set
{
this
._fileName = value; }
}
private
int
_idAttachment;
public
int
IdAttachment {
get
{
return
this
._idAttachment; }
set
{
this
._idAttachment = value; }
}
private
int
_attachmentType;
public
int
AttachmentType {
get
{
return
this
._attachmentType; }
set
{
this
._attachmentType = value; }
}
#endregion
}
public
partial
class
Default2 : System.Web.UI.Page
{
protected
void
Page_Load(
object
sender, EventArgs e) {
}
#region Links
protected
void
RadGrid1_ItemCreated(
object
sender, GridItemEventArgs e) {
if
(e.Item
is
GridEditableItem && e.Item.IsInEditMode) {
}
}
#region DataSource
protected
void
LinksObjectDataSource_Selecting(
object
sender, ObjectDataSourceSelectingEventArgs e) {
}
#endregion
#region Gridview
protected
void
LinksGridView_PreRender(
object
sender, EventArgs e) {
}
protected
void
LinksGridView_ItemCreated(
object
sender, GridItemEventArgs e) {
}
protected
void
DisableControls(ControlCollection controls) {
foreach
(Control c
in
controls) {
if
(c
is
WebControl) {
((WebControl)c).Enabled =
false
;
}
DisableControls(c.Controls);
}
}
protected
void
LinksRadGrid_NeedDataSource(
object
sender, GridNeedDataSourceEventArgs e) {
GWAttachment att1 =
new
GWAttachment();
att1.IdAttachment = 1;
att1.Title =
"Test 1"
;
att1.Description =
"Decription 1"
;
att1.Url =
"http://www.google.com"
;
att1.AttachmentType = 3;
GWAttachment att2 =
new
GWAttachment();
att2.IdAttachment = 2;
att2.Title =
"Test 2"
;
att2.Description =
"Decription 2"
;
att2.Url =
"http://www.google.com/test"
;
att2.AttachmentType = 4;
List<GWAttachment> attachmentList =
new
List<GWAttachment>();
attachmentList.Add(att1);
attachmentList.Add(att2);
DataTable dt = ListHelper.ToDataTable<GWAttachment>(attachmentList);
this
.__linksRadGrid.DataSource = dt;
}
protected
void
LinksRadGrid_ItemDataBound(
object
sender, GridItemEventArgs e) {
if
(e.Item
is
GridDataItem) {
GridDataItem gridDataItem = (GridDataItem)e.Item;
int
attachedType =
int
.Parse(gridDataItem[
"AttachmentType"
].Text);
ImageButton image = (ImageButton)gridDataItem[
"Type"
].FindControl(
"__attachedTypeImageButton"
);
if
(attachedType == 3
&& !
string
.IsNullOrEmpty(gridDataItem[
"URL"
].Text)) {
int
idDocument =
this
.GetDocumentLinksId(gridDataItem[
"URL"
].Text);
if
(idDocument > 0) {
image.OnClientClick =
this
.BuildDocumentPopupScript(idDocument);
}
else
{
this
.ShowImageError(image,
"Error : unable to parse the internal document id! Please correct the URL."
);
}
}
else
if
(attachedType == 4
&& !
string
.IsNullOrEmpty(gridDataItem[
"URL"
].Text)) {
image.OnClientClick =
this
.WindowsOpenPopup(gridDataItem[
"URL"
].Text);
}
else
if
(attachedType == 5) {
int
idAttachment =
int
.Parse(gridDataItem.GetDataKeyValue(
"IdAttachment"
).ToString());
image.OnClientClick =
this
.GetAttachmentLinksUrl(idAttachment);
}
else
{
}
}
else
if
(e.Item
is
GridEditFormItem
&& e.Item.IsInEditMode) {
GridEditFormItem editItem = e.Item
as
GridEditFormItem;
TextBox urlTxtBox = (TextBox)editItem.FindControl(
"__urlTextBox"
);
RadUpload linksFileUpload = (RadUpload)editItem.FindControl(
"__fileUpload"
);
Control linksFileUploadDIV = (Control)editItem.FindControl(
"__fileUploadDiv"
);
if
(urlTxtBox !=
null
&& linksFileUpload !=
null
&& linksFileUploadDIV !=
null
) {
// It is forbidden to reset a FileUpload, so we reset the dive container!
string
onChangeEventUrlTxtBox =
"LinksUrlTextBox_OnChange('"
+ linksFileUploadDIV.ClientID +
"')"
;
string
onChangeEventLinksFileUpload =
"LinksFileUpload_OnChange('"
+ urlTxtBox.ClientID +
"')"
;
urlTxtBox.Attributes.Add(
"onchange"
, onChangeEventUrlTxtBox);
linksFileUpload.Attributes.Add(
"onchange"
, onChangeEventLinksFileUpload);
}
}
}
#region Attachment file
protected
String GetAttachmentLinksUrl(
int
idAttachment) {
String page =
"~/Attachment.aspx"
;
page = VirtualPathUtility.ToAbsolute(page);
StringBuilder url =
new
StringBuilder(page);
url.AppendFormat(
"?IdAttachment={0}&Type={1}"
, idAttachment, 3);
string
javaScript =
"javascript:window.open('{0}','popup{1}','width=650,height=750,scrollbars=yes');return false;"
;
return
String.Format(javaScript, url.ToString(), idAttachment);
}
#endregion
protected
void
LinksRadGrid_ItemCommand(
object
source, GridCommandEventArgs e) {
if
(e.CommandName == RadGrid.DownloadAttachmentCommandName) {
GridEditFormItem editFormItem = (GridEditFormItem)e.Item;
}
}
protected
void
LinksRadGrid_EditCommand(
object
source, GridCommandEventArgs e) {
if
(e.CommandName == RadGrid.EditCommandName
&& e.Item
is
GridDataItem) {
GridDataItem gridDataItem = (GridDataItem)e.Item;
TextBox urlTxtBox = (TextBox)gridDataItem.FindControl(
"__urlTextBox"
);
RadUpload linksFileUpload = (RadUpload)gridDataItem.FindControl(
"__fileUpload"
);
if
(urlTxtBox !=
null
&& linksFileUpload.UploadedFiles !=
null
) {
urlTxtBox.Attributes.Add(
"onchange"
,
"LinksUrlTextBox_OnChange("
+ linksFileUpload.ClientID +
")"
);
linksFileUpload.Attributes.Add(
"onchange"
,
"LinksFileUpload_OnChange("
+ urlTxtBox.ClientID +
")"
);
}
}
}
protected
void
LinksRadGrid_InsertCommand(
object
sender, GridCommandEventArgs e) {
if
(e.CommandName == RadGrid.PerformInsertCommandName) {
if
(e.Item
is
GridEditFormItem) {
GridEditFormItem gridDataItem = (GridEditFormItem)e.Item;
this
.SaveAttachment(gridDataItem,
false
);
this
.__linksRadGrid.Rebind();
}
}
}
protected
void
LinksRadGrid_UpdateCommand(
object
sender, GridCommandEventArgs e) {
if
(e.CommandName == RadGrid.UpdateCommandName) {
if
(e.Item
is
GridEditFormItem) {
GridEditFormItem gridDataItem = (GridEditFormItem)e.Item;
this
.SaveAttachment(gridDataItem,
true
);
this
.__linksRadGrid.Rebind();
}
}
}
protected
void
LinksRadGrid_DeleteCommand(
object
sender, GridCommandEventArgs e) {
GridEditableItem editedItem = e.Item
as
GridEditableItem;
}
#region Save the Attachment of the document
private
void
SaveAttachment(GridEditFormItem gridDataItem,
bool
isAttachmentUpdate) {
int
idAttachment = 0;
if
(isAttachmentUpdate) {
idAttachment = Convert.ToInt32(gridDataItem.GetDataKeyValue(
"IdAttachment"
));
}
TextBox titleTxtBox = (TextBox)gridDataItem.FindControl(
"__titleTextBox"
);
TextBox descriptionTxtBox = (TextBox)gridDataItem.FindControl(
"__decriptionTextBox"
);
TextBox urlTxtBox = (TextBox)gridDataItem.FindControl(
"__urlTextBox"
);
RadUpload linksFileUpload = (RadUpload)gridDataItem.FindControl(
"__fileUpload"
);
string
title =
string
.Empty;
string
description =
string
.Empty;
string
url =
string
.Empty;
if
(titleTxtBox !=
null
) title = titleTxtBox.Text;
if
(descriptionTxtBox !=
null
) description = descriptionTxtBox.Text;
if
(urlTxtBox !=
null
) url = urlTxtBox.Text;
GWAttachment attachment =
new
GWAttachment();
attachment.Title = title;
attachment.Description = description;
attachment.Url = url;
Stream file =
null
;
if
(linksFileUpload !=
null
&& linksFileUpload.UploadedFiles !=
null
&& urlTxtBox !=
null
&&
string
.IsNullOrEmpty(url)) {
attachment.AttachmentType = 5;
if
(linksFileUpload.UploadedFiles !=
null
&& linksFileUpload.UploadedFiles.Count == 1) {
UploadedFile uploadedFile = linksFileUpload.UploadedFiles[0];
file = uploadedFile.InputStream;
}
}
//If a file is also defined, we take only the url when it exist too
if
(urlTxtBox !=
null
&& !
string
.IsNullOrEmpty(url)) {
if
(url.Contains(HttpContext.Current.Request.Url.Host)) {
attachment.AttachmentType = 3;
}
else
{
attachment.AttachmentType = 4;
}
}
}
#endregion
private
string
BuildDocumentPopupScript(
int
documentId) {
string
popupScript =
string
.Empty;
string
clientUrl = ResolveClientUrl(
"~/DetailPopup.aspx"
);
clientUrl =
string
.Format(
"{0}?idDocument={1}"
, clientUrl, documentId);
popupScript =
string
.Format(
"javascript:window.open('{0}','{1}','width=800,height=750,resizable=yes,scrollbars=yes');return false;"
, clientUrl, 10);
return
popupScript;
}
private
string
WindowsOpenPopup(
string
url) {
string
popupScript =
string
.Empty;
popupScript =
string
.Format(@
"javascript:window.open('{0}','{1}','width=800,height=750,resizable=yes,scrollbars=yes');return false;"
, url, url);
return
popupScript;
}
private
int
GetDocumentLinksId(
string
url) {
int
idDocumentLinks = -1;
var uri =
new
Uri(url);
var query = HttpUtility.ParseQueryString(uri.Query);
return
idDocumentLinks;
}
private
ImageButton ShowImageError(ImageButton imageBut,
string
message) {
return
imageBut;
}
#endregion
#endregion
}
Does someone have a solution ??
Thank you for your help