I have a grid where I add dynamically created columns when a user starts an insert.
When the user actually does insert I set 'e.Canceled = true' to simulate a server side validation error. The dynamic columns disappear in the insert row. Notice the region combo box is still displayed because it is declaritive. How can I get the grid to show the columns to the user when the event is cancelled?
Page Code
ASPX
When the user actually does insert I set 'e.Canceled = true' to simulate a server side validation error. The dynamic columns disappear in the insert row. Notice the region combo box is still displayed because it is declaritive. How can I get the grid to show the columns to the user when the event is cancelled?
Page Code
using System; |
using System.Collections.Generic; |
using System.Data; |
using System.Web.UI; |
using System.Web.UI.WebControls; |
using Telerik.Web.UI; |
namespace ITemplateTest |
{ |
public partial class _Default : Page |
{ |
private bool isInserting = false; |
protected void Page_Load(object sender, EventArgs e) |
{ |
var dict = new DataTable(); |
dict.Columns.Add("Region"); |
dict.Rows.Add("Region1"); |
dict.Rows.Add("Region2"); |
TestGrid.DataSource = dict; |
TestGrid.DataBind(); |
} |
protected void TestGrid_ItemCommand(object source, GridCommandEventArgs e) |
{ |
switch (e.CommandName) |
{ |
case RadGrid.InitInsertCommandName: |
var dateTemplate = new DatePickerTemplate(); |
var dateColumn = new GridTemplateColumn { EditItemTemplate = dateTemplate, HeaderText = "Test Date" }; |
TestGrid.Columns.AddAt(TestGrid.Columns.Count, dateColumn); |
var comboTemplate = new ComboBoxTemplate(); |
var comboColumn = new GridTemplateColumn { EditItemTemplate = comboTemplate, HeaderText = "Test Combo" }; |
TestGrid.Columns.AddAt(TestGrid.Columns.Count, comboColumn); |
TestGrid.ShowHeader = false; |
isInserting = true; |
break; |
case RadGrid.CancelCommandName: |
isInserting = false; |
TestGrid.Columns.RemoveAt(1); |
TestGrid.ShowHeader = true; |
break; |
case RadGrid.PerformInsertCommandName: |
isInserting = true; |
e.Canceled = true; |
break; |
} |
} |
protected void TestGrid_ItemDataBound(object sender, GridItemEventArgs e) |
{ |
if (e.Item == null) return; |
if (isInserting && e.Item is GridDataItem) |
{ |
//Merge the cells that have been inserted with the name cell. |
var numOfRequired = 2; |
e.Item.Cells[0].ColumnSpan = numOfRequired + 1; |
for (var i = 1; i <= numOfRequired; i++) |
{ |
e.Item.Cells.RemoveAt(e.Item.Cells.Count - 1); |
} |
} |
if (!isInserting && e.Item is GridDataItem) |
{ |
//Set the column span to the correct value since it may have been altered by an insert |
e.Item.Cells[0].ColumnSpan = 1; |
} |
} |
} |
class DatePickerTemplate : ITemplate |
{ |
public void InstantiateIn(Control container) |
{ |
var ctl = new RadDatePicker |
{ |
SelectedDate = DateTime.Now |
}; |
ctl.DateInput.Attributes.Add("FactID", "FactIDValue"); |
ctl.DateInput.Attributes.Add("HiddenFieldID", "HiddenFieldIDValue"); |
ctl.DateInput.ClientEvents.OnValueChanged = "DatePicker_Changed"; |
container.Controls.Add(ctl); |
} |
} |
public class ComboBoxTemplate : ITemplate |
{ |
public void InstantiateIn(Control container) |
{ |
var ctl = new RadComboBox() |
{ |
ID = "RadComboBox" |
}; |
//foreach(DataRow row in dt.Rows) |
//{ |
// ctl.Items.Add(new RadComboBoxItem(row[textField].ToString(), row[valueField].ToString())); |
//} |
//if (noValue != null) |
// ctl.Items.Insert(0, new RadComboBoxItem(noValue, noValue_Value)); |
//ctl.Attributes.Add("onChange", string.Format("{0}(this);", jScriptFunction)); |
ctl.Attributes.Add("FactID", "SomeID"); |
ctl.Attributes.Add("HiddenFieldID", "SomeOtherID"); |
container.Controls.Add(ctl); |
} |
} |
} |
ASPX
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="ITemplateTest._Default" %> |
<%@ Register Assembly="Telerik.Web.UI" Namespace="Telerik.Web.UI" TagPrefix="telerik" %> |
<%@ Import Namespace="BusinessGlossary"%> |
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> |
<html xmlns="http://www.w3.org/1999/xhtml" > |
<head runat="server"> |
<title>Test Page</title> |
</head> |
<body> |
<form id="form1" runat="server"> |
<div id="ScriptDiv" runat="server"> <!-- did this because of asp.net code sections failing --> |
<!-- TODO: SEB - Move to .js file --> |
<script type="text/javascript"> |
var tStart = null; |
var nodeAdditionButton = null; |
var pairDelimiter = '|'; |
var nameValueDelimiter = '~'; |
function disableEnterKey() |
{ |
if (window.event.keyCode == 13) |
{ |
event.returnValue=false; |
event.cancel = true; |
} |
} |
function requestStart(sender, eventArgs) |
{ |
tStart = new Date(); |
document.body.style.cursor = 'wait'; |
} |
function responseEnd(sender, eventArgs) |
{ |
document.body.style.cursor = 'default'; |
if (nodeAdditionButton != null) { |
nodeAdditionButton.style.cursor = 'default'; |
nodeAdditionButton = null; |
} |
//Comment in final per Eddie 10/9 |
var tDate = new Date(); |
var tDiff = tDate.getTime() - tStart.getTime(); |
var tTimer = new Date(); |
tTimer.setTime(tDiff); |
var label = document.getElementById("TimingLabel"); |
label.innerText = tTimer.getSeconds() + "." + tTimer.getMilliseconds() + " seconds"; |
//TODO: Use is naming |
if (openExcelWindow) { |
openExportWindow(); |
openExcelWindow = false; |
} |
} |
// This function will open a window and run the screen to export to excel |
function openExportWindow() { |
w = window.open('ExportToExcel.aspx', 'exportToExcel', 'height=450,width=700,status=yes,resizable,toolbar=no,menubar=no,location=no'); |
//setTimeout('w.close()', 5000); |
} |
var supressDropDownClosing = false; |
var openExcelWindow = false; |
function OnClientDropDownClosing(sender, eventArgs) |
{ |
eventArgs.set_cancel(supressDropDownClosing); |
} |
function ExportToExcel(button) |
{ |
openExcelWindow = true; |
} |
//Fact Maintenance -- comment this |
function FactDataTypeChanged(dataTypeDropDown, dataValidationTypeDropDownID) |
{ |
var dataValidationTypeDropDown = document.getElementById(dataValidationTypeDropDownID); |
var selectedValue = dataTypeDropDown[dataTypeDropDown.selectedIndex].text; |
if (selectedValue == 'String' || selectedValue == 'Numeric') |
{ |
dataValidationTypeDropDown.disabled = false; |
} |
else |
{ |
for (var itemIndex = 0; itemIndex < dataValidationTypeDropDown.length; itemIndex++) |
{ |
if (dataValidationTypeDropDown[itemIndex].text == 'None') { |
dataValidationTypeDropDown.selectedIndex = itemIndex; |
break; |
} |
} |
dataValidationTypeDropDown.disabled = true; |
} |
} |
function validateDateInput (input, args){ |
var message = "the value " + input.get_textBoxValue() + " is not a valid date."; |
window.alert(message); |
input.clear(); |
input.focus(); |
} |
function DisableControls() |
{ |
for (var i=0; i<document.forms[0].elements.length; i++) |
{ |
var obj = document.forms[0].elements[i]; |
obj.disabled = true; |
} |
} |
function EnableControls() |
{ |
for (var i=0; i<document.forms[0].elements.length; i++) |
{ |
var obj = document.forms[0].elements[i]; |
obj.disabled = false; |
} |
} |
function DataElementTreeInputChanged(sender, eventArgs) |
{ |
Tree_RadInputChanged(sender, eventArgs, 'dataElementTreeNodeFields', 'dataElementTreeUpdateValues'); |
} |
function DataElementTreeComboBoxChanged(sender, eventArgs) |
{ |
Tree_RadComboBoxChanged(sender, eventArgs, 'dataElementTreeNodeFields', 'dataElementTreeUpdateValues'); |
} |
function ProcessTreeInputChanged(sender, eventArgs) |
{ |
Tree_RadInputChanged(sender, eventArgs, 'processTreeNodeFields', 'processTreeUpdateValues'); |
} |
function ProcessTreeComboBoxChanged(sender, eventArgs) |
{ |
Tree_RadComboBoxChanged(sender, eventArgs, 'processTreeNodeFields', 'processTreeUpdateValues'); |
} |
function ApplicationTreeInputChanged(sender, eventArgs) |
{ |
Tree_RadInputChanged(sender, eventArgs, 'applicationTreeNodeFields', 'applicationTreeUpdateValues'); |
} |
function ApplicationTreeComboBoxChanged(sender, eventArgs) |
{ |
Tree_RadComboBoxChanged(sender, eventArgs, 'applicationTreeNodeFields', 'applicationTreeUpdateValues'); |
} |
function Tree_RadInputChanged(sender, eventArgs, treeNodeFieldsHidden, treeValuesHidden) |
{ |
var factTree = document.getElementById(treeNodeFieldsHidden); |
var inputField = sender.get_element(); |
nodeID = FindNodeIDByControlID(inputField.id, treeNodeFieldsHidden); |
var value = eventArgs.get_newValue(); |
FieldValueChanged(nodeID, treeValuesHidden, value); |
} |
function Tree_RadComboBoxChanged(sender, eventArgs, treeNodeFieldsHidden, treeValuesHidden) |
{ |
var comboBoxInput = sender.get_element(); |
nodeID = FindNodeIDByControlID(comboBoxInput.id, treeNodeFieldsHidden); |
var value = eventArgs.get_item().get_text(); |
FieldValueChanged(nodeID, treeValuesHidden, value); |
} |
function FindNodeIDByControlID (controlID, treeNodeFieldsHidden) |
{ |
var factTree = document.getElementById(treeNodeFieldsHidden); |
var array = factTree.value.split(pairDelimiter); |
var nodeID; |
for (i = 0; i < array.length; i++) |
{ |
var nameValuePair = array[i].split(nameValueDelimiter); |
if (nameValuePair.length = 2) |
{ |
if (nameValuePair[0] == controlID) |
{ |
nodeID = nameValuePair[1] |
} |
} |
} |
return nodeID; |
} |
function Tree_ListBoxUpdated(nodeID, listBox, treeNodeFieldsHidden, treeValuesHidden) |
{ |
var value = ''; |
for(i = 0; i < listBox.length; i++) |
{ |
if (listBox[i].selected) |
{ |
valuevalue = value + ',' + listBox[i].value; |
} |
} |
valuevalue = value.replace(/^\,/, '') |
FieldValueChanged(nodeID, treeValuesHidden, value); |
} |
function Tree_CheckBoxUpdated(nodeID, checkBoxID, checked, treeNodeFieldsHidden, treeValuesHidden) |
{ |
var value; |
if (checked) |
value = 'true'; |
else |
value = 'false'; |
FieldValueChanged(nodeID, treeValuesHidden, value); |
} |
function CheckBoxChanged(checkBox, ID, hiddenFieldID) |
{ |
var value; |
if (checkBox.checked) |
value = 'true'; |
else |
value = 'false'; |
FieldValueChanged(ID, hiddenFieldID, value); |
} |
function RadComboBoxChanged(comboBox) |
{ |
var value = comboBox.options(comboBox.selectedIndex).text; |
var ID = comboBox.getAttribute('FactID'); |
var hiddenFieldID = comboBox.getAttribute('HiddenFieldID'); |
FieldValueChanged(ID, hiddenFieldID, value); |
} |
function RadDatePickerChanged(sender, eventArgs) |
{ |
var inputField = sender.get_element(); |
var value = eventArgs.get_newValue(); |
var ID = inputField.getAttribute('FactID'); |
var hiddenFieldID = inputField.getAttribute('HiddenFieldID'); |
FieldValueChanged(ID, hiddenFieldID, value); |
} |
function RadTextBoxChanged(textBox) |
{ |
var value = textBox.value; |
var ID = textBox.getAttribute('FactID'); |
var hiddenFieldID = textBox.getAttribute('HiddenFieldID'); |
FieldValueChanged(ID, hiddenFieldID, value); |
} |
function FieldValueChanged(valueID, hiddenTextBoxID, value) |
{ |
//Look for previous values in string |
var hiddenTextBox = document.getElementById(hiddenTextBoxID); |
var valueArray = hiddenTextBox.value.split(pairDelimiter); |
var found = false; |
for (i = 0; i < valueArray.length; i++) |
{ |
var nameValuePair = valueArray[i].split(nameValueDelimiter); |
if (nameValuePair.length = 2) |
{ |
if (nameValuePair[0] == valueID) |
{ |
var oldValue = nameValuePair[1]; |
found = true; |
} |
} |
} |
var pairsValue = hiddenTextBox.value; |
if (found) |
{ |
pairsValuepairsValue = pairsValue.replace(valueID + nameValueDelimiter + oldValue, valueID + nameValueDelimiter + value); |
} |
else |
{ |
pairsValue += pairDelimiter + valueID + nameValueDelimiter + value; |
pairsValuepairsValue = pairsValue.replace(/^\~/, ''); |
} |
hiddenTextBox.value = pairsValue; |
} |
function ProcessNodeMultipleAction(button, controlToUse) |
{ |
nodeAdditionButton = button; |
button.style.cursor = 'wait'; |
var control = document.getElementById(controlToUse); |
var newValue = 'NodeID:' + button.getAttribute('NodeID'); |
var newValuenewValue = newValue + ';CommandName:' + button.getAttribute('CommandName'); |
var newValuenewValue = newValue + ';GroupInstanceID:' + button.getAttribute('GroupInstanceID'); |
var newValuenewValue = newValue + ';FactInstanceID:' + button.getAttribute('FactInstanceID'); |
var newValuenewValue = newValue + ';ArtifactFactInstanceID:' + button.getAttribute('ArtifactFactInstanceID'); |
var newValuenewValue = newValue + ';ParentGroupID:' + button.getAttribute('ParentGroupID'); |
var newValuenewValue = newValue + ';FactID:' + button.getAttribute('FactID'); |
control.value = newValue; //This will trigger the text box text_changed event to fire..basically posting back for us. |
} |
function ClearDatePicker(radDatPicker) |
{ |
var datePicker = document.getElementById(radDatPicker); |
if (datePicker != null) |
{ |
datePicker.Clear(); |
} |
return false; |
} |
function DatePicker_Changed(sender, eventArgs) |
{ |
return true; |
} |
function ClearControlSelections(nodeID, target, treeNodeFieldsHidden, treeValuesHidden) |
{ |
var control = document.getElementById(target); |
control.selectedIndex = -1; |
Tree_ListBoxUpdated(nodeID, control, treeNodeFieldsHidden, treeValuesHidden); |
} |
function SetRegionVisibility(dropdown, target) |
{ |
var targetDropDown = document.getElementById(target); |
if (dropdown.selectedIndex != 0) |
{ |
targetDropDown.disabled = true; |
for( var i=0, limit=targetDropDown.options.length; i < limit; ++i ) |
{ |
targetDropDown.options[i].selected=false; |
} |
} |
else |
targetDropDown.disabled = false; |
} |
</script> |
</div> |
<div runat="server" id="TestGridDiv"> |
<telerik:RadScriptManager ID="RadScriptManager1" Runat="server"> |
</telerik:RadScriptManager> |
<telerik:RadAjaxManager ID="RadAjaxManager1" runat="server"> |
<AjaxSettings> |
<telerik:AjaxSetting AjaxControlID="TestGrid"> |
<UpdatedControls><telerik:AjaxUpdatedControl ControlID="TestGrid" /></UpdatedControls> |
</telerik:AjaxSetting> |
</AjaxSettings> |
</telerik:RadAjaxManager> |
</div> |
<telerik:RadTabStrip ID="RadTabStrip1" runat="server" SelectedIndex="0" MultiPageID="RadMultiPage1"> |
<Tabs> |
<telerik:RadTab runat="server" Text="Root RadTab1" Selected="True" PageViewID="RadPageView1"> |
</telerik:RadTab> |
<telerik:RadTab runat="server" Text="Root RadTab2" PageViewID="RadPageView2"> |
</telerik:RadTab> |
</Tabs> |
</telerik:RadTabStrip> |
<telerik:RadMultiPage ID="RadMultiPage1" Runat="server"> |
<telerik:RadPageView ID="RadPageView2" Runat="server" Width="100%"> |
<telerik:RadDatePicker ID="RadDatePicker1" Runat="server"> |
</telerik:RadDatePicker> |
</telerik:RadPageView> <telerik:RadPageView ID="RadPageView1" Runat="server" Width="100%"> |
<div id="TestGridPanel"> |
<telerik:RadGrid ID="TestGrid" runat="server" AutoGenerateColumns="False" |
GridLines="None" onitemcommand="TestGrid_ItemCommand" |
onitemdatabound="TestGrid_ItemDataBound"> |
<mastertableview commanditemdisplay="Top" editmode="EditForms"> |
<norecordstemplate> |
<asp:Label ID="ProcessFilterLabel" runat="server" Text="No processes found." /> |
</norecordstemplate> |
<Columns> |
<telerik:GridTemplateColumn HeaderText="Region" UniqueName="region"> |
<EditItemTemplate> |
<asp:ListBox ID="RegionListBox" runat="server"><asp:ListItem Text="Region" Value="Value"></asp:ListItem></asp:ListBox> |
</EditItemTemplate> |
<ItemTemplate>Hello</ItemTemplate> |
</telerik:GridTemplateColumn> |
</Columns> |
<editformsettings> |
<popupsettings scrollbars="None" /> |
</editformsettings> |
</mastertableview> |
</telerik:RadGrid> |
</div> |
</telerik:RadPageView> |
</telerik:RadMultiPage> |
</form> |
</body> |
</html> |