Hi ALL,
I have used rad grid with inline editing functionality, i have define RadGrid_UpdateCommand event for updating record, when i click on update button event get fired, but in event i used following code
var EditedItem: GridEditableItem;
KeyValue: Int64;
NewValues: Hashtable;
EditedItem := e.Item as GridEditableItem;
KeyValue := Int64(e.Item.OwnerTableView.DataKeyValues[e.Item.ItemIndex]['ID']);
NewValues := new Hashtable;
e.Item.OwnerTableView.ExtractValuesFromItem(NewValues, EditedItem);
But problem is here for NewValues hashtable i got null values, i didn't understand that what is the problem behind this.
I got the following error.
specified argument was out of the range of valid values. parameter name index
is there any problem to binding grid or something else.
Please help me.
Thanks
Kaushal
I have used rad grid with inline editing functionality, i have define RadGrid_UpdateCommand event for updating record, when i click on update button event get fired, but in event i used following code
var EditedItem: GridEditableItem;
KeyValue: Int64;
NewValues: Hashtable;
EditedItem := e.Item as GridEditableItem;
KeyValue := Int64(e.Item.OwnerTableView.DataKeyValues[e.Item.ItemIndex]['ID']);
NewValues := new Hashtable;
e.Item.OwnerTableView.ExtractValuesFromItem(NewValues, EditedItem);
But problem is here for NewValues hashtable i got null values, i didn't understand that what is the problem behind this.
I got the following error.
specified argument was out of the range of valid values. parameter name index
is there any problem to binding grid or something else.
Please help me.
Thanks
Kaushal
7 Answers, 1 is accepted
0
Hi Kaushal,
This error normally indicates that you are trying to access an element with index greater than the size of the collection. You can make sure that e.Item.ItemIndex is within range and that the 'ID' field is specified as a datakey for the MasterTableView. Also for futher information you may check the following help article:
Retrieving original values for edited item
Simple vs. Advance Data-binding
Let me know how this works for you and if you have any other questions.
Sincerely yours,
Marin
the Telerik team
This error normally indicates that you are trying to access an element with index greater than the size of the collection. You can make sure that e.Item.ItemIndex is within range and that the 'ID' field is specified as a datakey for the MasterTableView. Also for futher information you may check the following help article:
Retrieving original values for edited item
Simple vs. Advance Data-binding
Let me know how this works for you and if you have any other questions.
Sincerely yours,
Marin
the Telerik team
Do you want to have your say when we set our development plans? Do you want to know when a feature you care about is added or when a bug fixed? Explore the Telerik Public Issue Tracking system and vote to affect the priority of the items
0
Kaushal
Top achievements
Rank 1
answered on 25 Nov 2010, 11:04 AM
Hi
I have set the value of Datakey of MasterTableView also, but still getting problem,
Here i am mentioning my code please check it once and let me know if i am missing anything.
.aspx
.cs file
Class Flle
On RadGrid1_UpdateCommand method when i try to get new values i got an error.
e.Item.OwnerTableView.ExtractValuesFromItem(NewValues, editedItem); --- Here i got an error.
Here i am also attache scree shot of trace value.
I have set the value of Datakey of MasterTableView also, but still getting problem,
Here i am mentioning my code please check it once and let me know if i am missing anything.
.aspx
<form id="form1" runat="server"> <div> <telerik:RadScriptManager ID="ScriptManager1" runat="server" EnableTheming="True"> </telerik:RadScriptManager> <telerik:radgrid id="RadGrid1" runat="server" onneeddatasource="RadGrid1_NeedDataSource" enableajax="true" autogenerateeditcolumn="True" showgrouppanel="True" width="99%" allowpaging="True" allowautomaticupdates="true" allowsorting="True" allowmultirowselection="True" height="100%" skin="Vista" onitemupdated="RadGrid1_ItemUpdated" onupdatecommand="RadGrid1_UpdateCommand"> <ClientSettings AllowDragToGroup="True" AllowColumnsReorder="True" ReorderColumnsOnClient="True" AllowKeyboardNavigation="True"> <Selecting AllowRowSelect="True" /> <ClientEvents OnGridCreated="ResizeEvent" /> <Scrolling AllowScroll="True" UseStaticHeaders="True" FrozenColumnsCount="3" /> <Resizing ResizeGridOnColumnResize="True" AllowColumnResize="True" /> </ClientSettings> <MasterTableView TableLayout="Fixed" Width="99%" GridLines="Both" AllowAutomaticUpdates="True" AutoGenerateColumns="False"> <ExpandCollapseColumn> <HeaderStyle Width="20px" /> </ExpandCollapseColumn> <EditFormSettings ColumnNumber="3"> <EditColumn ButtonType="PushButton" UniqueName="EditCommandColumn1"> </EditColumn> </EditFormSettings> <PagerStyle AlwaysVisible="True" /> <HeaderStyle Wrap="False" /> </MasterTableView> </telerik:radgrid> </div> </form>.cs file
GridTest = public partial class(TBasePage) private FGridHelper: TGridHelper; method GetDataGrid: RadGrid; protected method Page_Load(sender: Object; e: EventArgs); method RadGrid1_NeedDataSource(source: System.Object; e: Telerik.Web.UI.GridNeedDataSourceEventArgs); method RadGrid1_UpdateCommand(sender: Object; e: Telerik.Web.UI.GridCommandEventArgs); method RadGrid1_ItemUpdated(source: System.Object; e: Telerik.Web.UI.GridUpdatedEventArgs); property grdData: RadGrid read GetDataGrid; end;implementationmethod GridTest.GetDataGrid: RadGrid;begin Result := RadGrid1;end;method GridTest.Page_Load(sender: Object; e: EventArgs);begin FGridHelper := new TGridHelper(EasyIPConnection, grdData, Session);end;method GridTest.RadGrid1_ItemUpdated(source: System.Object; e: Telerik.Web.UI.GridUpdatedEventArgs);begin FGridHelper.UpdateCommand(source, e);end;method GridTest.RadGrid1_UpdateCommand(sender: Object; e: Telerik.Web.UI.GridCommandEventArgs);var editedItem : GridEditableItem; PlantID,PlantName,updateQuery : String; NewValues: Hashtable;begin editedItem := e.Item as GridEditableItem; var editMan : GridEditManager; editMan := editedItem.EditManager; //for each column:GridColumn in e.Item.OwnerTableView.RenderColumns do //begin //if (column is IGridEditableColumn) then //begin //var str : String; //str := "abc"; //end; //end; // //var txt := new TextBox; NewValues := new Hashtable; e.Item.OwnerTableView.ExtractValuesFromItem(NewValues, editedItem);end;method GridTest.RadGrid1_NeedDataSource(source: System.Object; e: Telerik.Web.UI.GridNeedDataSourceEventArgs);var SubnetData : DataTable;begin //if Boolean(Session['LoggedIn']) then //FGridHelper.OpenGrid(FTreeHelper.GetNodeData(tvSubnets.SelectedNode).NodeType, //FTreeHelper.GetNodeData(tvSubnets.SelectedNode).AutonomousNetworkId, //FTreeHelper.GetNodeData(tvSubnets.SelectedNode).SubnetId); // When we require to pass field id than we have to use this method and remove comment. //
FGridHelper.OpenGrid(RadTextBox2.Text.Trim,hdnSearchText.Value.ToUpper,getUserTableID(hdnSearchText.Value.ToUpper),GetOption(hdnSearchMethod.Value),GetFieldId(hdnFieldList.Value.ToString())); // Bind grid for right side search //FGridHelper.OpenGrid( ("","SUBNET","SUBNET","",nil); FGridHelper.OpenGrid("","ADDRESSES",2,EasyIPLibrary_Intf.TSearchOption.soContains,nil) end;Class Flle
TGridHelper = public class private FGridView: RadGrid; FEasyIPConnection: TClientConnection; FTableType: TTableType; FDataset: DataSet; FDatatable: DataTable; FSession: HttpSessionState; method FGridView_UpdateCommand(source: Object; e: GridCommandEventArgs); procedure DeleteCommand(source: System.Object; e: GridCommandEventArgs); method FGridView_DeleteCommand(source: Object; e: GridCommandEventArgs); method ItemDataBound(sender: System.Object; e: Telerik.Web.UI.GridItemEventArgs); function AddNewColumn(FieldName, HeaderText: String; IsReadOnly: Boolean): GridBoundColumn; method CreateColumnEditor(sender: System.Object; e: Telerik.Web.UI.GridCreateColumnEditorEventArgs); method ItemCreated(sender: System.Object; e: Telerik.Web.UI.GridItemEventArgs); method ItemCommand(sender: System.Object; e: Telerik.Web.UI.GridCommandEventArgs); method UpdateCommand(sender: System.Object; e: Telerik.Web.UI.GridCommandEventArgs); method ItemUpdated(sender: System.Object; e: Telerik.Web.UI.GridUpdatedEventArgs); property Session: HttpSessionState read FSession; protected public constructor(EasyIPConnection: TClientConnection; Grid: RadGrid; ASession: HttpSessionState); method OpenGrid(NodeType: TNodeType; AutonomousNetworkId, SubnetId: Int64); method OpenGrid(const SearchText: String; const TableName: String; TableId: Int64; SearchOption: TSearchOption; FieldIds: Array of System.Int64); method OpenGrid(const TableName: String); method OpenGrid; method UpdateCommand(source: System.Object; e: Telerik.Web.UI.GridUpdatedEventArgs); method CloseGrid; end;implementationconst ImageInfoField = '_IMAGE_INFO_FIELD_';constructor TGridHelper(EasyIPConnection: TClientConnection; Grid: RadGrid; ASession: HttpSessionState);begin FEasyIPConnection := EasyIPConnection; FSession := ASession; FGridView := Grid; FGridView.ItemDataBound += @ItemDataBound; FGridView.ItemUpdated += @UpdateCommand; FGridView.DeleteCommand += @DeleteCommand; FGridView.CreateColumnEditor += @CreateColumnEditor; FGridView.ItemCommand += @ItemCommand; FGridView.UpdateCommand += @UpdateCommand; end;function TGridHelper.AddNewColumn(FieldName, HeaderText: String; IsReadOnly: Boolean): GridBoundColumn; begin Result := new GridBoundColumn; Result.ReadOnly := IsReadOnly; Result.HeaderText := HeaderText; Result.DataField := FieldName; Result.HeaderStyle.Wrap := FALSE; Result.ItemStyle.Wrap := FALSE; Result.UniqueName := FieldName; if HeaderText = 'Subnet icon' then begin Result.HeaderText := ""; Result.HeaderStyle.Width := 30; Result.ItemStyle.HorizontalAlign := Result.ItemStyle.HorizontalAlign.Center; Result.Resizable := false; Result.Reorderable := false; end else Result.HeaderStyle.Width := 350; FGridView.MasterTableView.Columns.Add(Result);end;method TGridHelper.ItemDataBound(sender: System.Object; e: Telerik.Web.UI.GridItemEventArgs);var AGridItem: GridDataItem; AValue: String; NormalImageURL, SelectedImageURL: String; i: Integer; UserField: TUserField; LookupItem: TUserFieldLookup; Column: GridBoundColumn; ImageInfos: TStringList;begin if e.Item is GridDataItem then begin AGridItem := GridDataItem(e.Item); if FTableType = TTableType.ttSubnets then begin ImageInfos := new TStringList; // CIDR_MASK, ADDRESS_COUNT, CHILD_COUNT, ITEM_TYPE, SECONDARY_ITEM_TYPE for each s:String in AGridItem[ImageInfoField].Text.Split([',']) do ImageInfos.Add(s); if ImageInfos.Count = 5 then begin if ImageInfos[3] = 'G' then GetNodeImages(NormalImageURL, SelectedImageURL, TNodeType.ntGroup) else GetNodeImages(NormalImageURL, SelectedImageURL, TNodeType.ntSubnet, Integer.Parse(ImageInfos[0]), ImageInfos[1] <> '0', ImageInfos[2] <> '0'); AGridItem[ImageInfoField].Text := system.string.format('<img src="{0}" alt="" style="border-width:0px"/>', [NormalImageURL]); end else AGridItem[ImageInfoField].Text := ''; end; for i := 0 to pred(FGridView.Columns.Count) do begin if FGridView.Columns[i] is GridBoundColumn then begin Column := FGridView.Columns[i] as GridBoundColumn; UserField := FEasyIPConnection.FindUserField(TableTypeToTableName(FTableType), Column.DataField); if Assigned(UserField) then begin LookupItem := nil; for LoopLookupItem in UserField.LookupList do if LoopLookupItem.Caption = AValue then begin LookupItem := LoopLookupItem; Break; end; if Assigned(LookupItem) then begin if LookupItem.Description <> '' then AGridItem.Cells[i].Text := LookupItem.Description; if LookupItem.FontColour <> nil then AGridItem.Cells[i].ForeColor := GetWebColor(Integer(LookupItem.FontColour)); if LookupItem.BackgroundColour <> nil then AGridItem.Cells[i].BackColor := GetWebColor(Integer(LookupItem.BackgroundColour)); AGridItem.Cells[i].Font.Bold := LookupItem.FontBold; AGridItem.Cells[i].Font.Underline := LookupItem.FontUnderline; AGridItem.Cells[i].Font.Italic := LookupItem.FontItalic; end else begin if UserField.BackgroundColour <> nil then AGridItem.Cells[i].BackColor := GetWebColor(Integer(UserField.BackgroundColour)); if UserField.FontColour <> nil then AGridItem.Cells[i].ForeColor := GetWebColor(Integer(UserField.FontColour)); AGridItem.Cells[i].Font.Bold := UserField.FontBold; AGridItem.Cells[i].Font.Underline := UserField.FontUnderline; AGridItem.Cells[i].Font.Italic := UserField.FontItalic; end; end; end; end; end;end;method TGridHelper.UpdateCommand(source: System.Object; e: Telerik.Web.UI.GridUpdatedEventArgs);var EditedItem: GridEditableItem; SubnetId, KeyValue: Int64; NewValues: Hashtable; FieldNames: List<String>; FieldValues: List<Object>; TableName: String; i: Integer;begin EditedItem := e.Item as GridEditableItem; KeyValue := Int64(e.Item.OwnerTableView.DataKeyValues[e.Item.ItemIndex]['ID']); NewValues := Hashtable.Create; FieldNames := new List<String>; FieldValues := new List<Object>; //The GridTableView will fill the values from all editable columns in the hash e.Item.OwnerTableView.ExtractValuesFromItem(NewValues, EditedItem); for Entry:KeyValuePair<String, Object> in NewValues do begin FieldNames.Add(Entry.Key.ToString); FieldValues.Add(Entry.Value); end; case FTableType of TTableType.ttAddresses: TableName := 'ADDRESSES_USER_DATA'; TTableType.ttSubnets: TableName := 'SUBNETS_USER_DATA'; end; // case FEasyIPConnection.UpdateUserFields(TableName, KeyValue, FieldNames.ToArray, FieldValues.ToArray); (* ChangedRow := ChangedRows[0]; ChangedRow.BeginEdit; ATransaction := nil; try for Entry in newValues do begin FieldPropertiesItem
:=
SessionHelper.FieldPropertiesList.GetFieldPropertiesItem(Session['TableName'].ToString,
Entry.Key.ToString); if
(Assigned(FieldPropertiesItem)) and (FieldPropertiesItem.Mandatory) and
((not Assigned(Entry.Value)) or (Entry.Value.ToString = '')) then raise EEasyIPError.Create(system.string.Format(GetLocalisationString(105), [Entry.Key.ToString])); if not Assigned(entry.Value) then // Null cannot be assigned to ChangedRow ChangedRow[entry.Key.ToString] := DBNULL.Value else try ChangedRow[entry.Key.ToString] := entry.Value; except raise EEasyIPError.Create(system.string.format(GetLocalisationString(28), [entry.Value, entry.Key.ToString])); end; if SetSQL <> '' then SetSQL := concat(SetSQL, ','); SetSQL := system.string.format('{0}"{1}"=@P{2}', [SetSQL, entry.Key.ToString, ParamCounter.ToString]); SessionHelper.DBConnection.SQLCommand.Parameters.Add(FBParameter.Create(system.string.format('@P{0}',
[ParamCounter.ToString]), ChangedRow[entry.Key.ToString])); inc(ParamCounter); end; UpdateText := system.string.format(UpdateText, [SetSQL]); SessionHelper.ExecuteQuery(UpdateText); ChangedRow.EndEdit; SessionHelper.DBConnection.DataSet.AcceptChanges; SessionHelper.CommitTransaction; except on ex:Exception do begin ChangedRow.CancelEdit; e.Canceled := TRUE; SessionHelper.RollbackTransaction; With (e.Item as GridEditFormItem).FindControl('lblUpdateErrorTop') as &Label do begin Text := SessionHelper.DBConnection.TranslateException(ex); Visible := TRUE; end; With (e.Item as GridEditFormItem).FindControl('lblUpdateErrorBottom') as &Label do begin Text := SessionHelper.DBConnection.TranslateException(ex); Visible := TRUE; end; end; end; end;*)end;procedure TGridHelper.DeleteCommand(source: System.Object; e: GridCommandEventArgs);var EditedItem: GridEditableItem; SubnetId, KeyValue: Int64;begin EditedItem := e.Item as GridEditableItem; KeyValue := Int64(e.Item.OwnerTableView.DataKeyValues[e.Item.ItemIndex]['ID']); SubnetId := Int64(Session['LastDataGridSubnetId']); FEasyIPConnection.DeleteIPAddressesById(SubnetId, [KeyValue]);end;method TGridHelper.CloseGrid;begin FGridView.DataSource := nil; FGridView.Visible := FALSE;end;method TGridHelper.OpenGrid(NodeType: TNodeType; AutonomousNetworkId, SubnetId: Int64);begin FDataSet := nil; FTableType := TTableType.ttSubnets; case NodeType of TNodeType.ntAutonomousNetwork: begin FDataSet := FEasyIPConnection.GetGridRootNodes(AutonomousNetworkId); end; TNodeType.ntGroupWithChildren, TNodeType.ntRestrictedGroupWithChildren, TNodeType.ntSubnetWithChildren: begin FDataSet := FEasyIPConnection.GetGridChildNodes(AutonomousNetworkId, SubnetId); end; TNodeType.ntSubnetWithIPAddresses: begin FDataSet := FEasyIPConnection.GetGridNodeIPAddresses(SubnetId); FTableType := TTableType.ttAddresses; end; end; // case if Assigned(FDataSet) then begin FGridView.DataSource := FDataSet; FGridView.MasterTableView.DataMember := FDataset.Tables[0].TableName; FGridView.Visible := TRUE; OpenGrid; end else CloseGrid; Session['LastDataGridSubnetId'] := SubnetId;end;method TGridHelper.OpenGrid;const IMAGE_COL_WIDTH = 30;var UserFields: array of TUserField; NewButton: GridEditCommandColumn; NewGridButtonColumn: GridButtonColumn; KeyFieldNames: Array of String; i, FixedColCount: Integer; VisibleColumnCount, VisibleColumnIndex: Integer;begin FGridView.Columns.Clear; FixedColCount := 0; VisibleColumnCount := 0; SetLength(KeyFieldNames, 1); KeyFieldNames[0] := 'ID'; FGridView.MasterTableView.DataKeyNames := KeyFieldNames; case FTableType of TTableType.ttSubnets: begin FGridView.MasterTableView.EditFormSettings.CaptionDataField := 'SHORT_SUBNET'; FGridView.MasterTableView.EditFormSettings.CaptionFormatString := 'Subnet: <B>{0}</B>'; end; TTableType.ttAddresses: begin FGridView.MasterTableView.EditFormSettings.CaptionDataField := 'SHORT_IP_ADDRESS'; FGridView.MasterTableView.EditFormSettings.CaptionFormatString := 'IP Address: <B>{0}</B>'; end; end; FGridView.AutoGenerateEditColumn := true; FGridView.AllowAutomaticUpdates := false; // Create edit button NewButton := GridEditCommandColumn.Create; FGridView.Columns.Add(NewButton); NewButton.ButtonType := Telerik.Web.UI.GridButtonColumnType.ImageButton; NewButton.Groupable := FALSE; NewButton.HeaderStyle.Width := IMAGE_COL_WIDTH; NewButton.Reorderable := FALSE; NewButton.Resizable := FALSE; Inc(FixedColCount); // Create delete button if FTableType = TTableType.ttAddresses then begin NewGridButtonColumn := GridButtonColumn.Create; FGridView.Columns.Add(NewGridButtonColumn); NewGridButtonColumn.CommandName := 'Delete'; NewGridButtonColumn.ConfirmText := 'Are you sure you want to delete the selected IP address?'; NewGridButtonColumn.Text := '<img src="./Images/General/Delete.png" alt="x" style="border-width:0px"/>'; NewGridButtonColumn.HeaderStyle.Width := IMAGE_COL_WIDTH; NewGridButtonColumn.Groupable := FALSE; NewGridButtonColumn.Reorderable := FALSE; NewGridButtonColumn.Resizable := FALSE; Inc(FixedColCount); end; // Find the fields for the selected table UserFields := FEasyIPConnection.GetUserFields(TableTypeToTableName(FTableType)); for UserField in UserFields do begin if ((UserField.Selectable) and (not UserField.HiddenColumn)) or ((FTableType = TTableType.ttSubnets) and (UserField.FieldName = ImageInfoField)) then begin if UserField.FixedColumn then Inc(FixedColCount); if UserField.DisplayName = '' then AddNewColumn(UserField.FieldName, Uncapitalise(UserField.FieldName), UserField.ReadOnly) else AddNewColumn(UserField.FieldName, UserField.DisplayName, UserField.ReadOnly); if not UserField.ReadOnly then Inc(VisibleColumnCount); end; end; FGridView.ClientSettings.Scrolling.FrozenColumnsCount := FixedColCount; VisibleColumnIndex := 0; for i := 0 to pred(FGridView.Columns.Count) do if (FGridView.Columns[i] is GridBoundColumn) and (GridBoundColumn(FGridView.Columns[i]).Visible) and (not GridBoundColumn(FGridView.Columns[i]).ReadOnly) then begin GridBoundColumn(FGridView.Columns[i]).EditFormColumnIndex := Trunc((System.Double(FGridView.MasterTableView.EditFormSettings.ColumnNumber) / System.Double(VisibleColumnCount)) * System.Double(VisibleColumnIndex)); Inc(VisibleColumnIndex); end; end;method TGridHelper.ItemCreated(sender: System.Object; e: Telerik.Web.UI.GridItemEventArgs);//var// lbl: &Label;begin {if (e.Item is GridEditFormItem) and (e.Item.IsInEditMode) then begin lbl := &Label.Create; lbl.ID := 'lblUpdateErrorTop'; lbl.Visible := false; lbl.CssClass := 'label_error'; (e.Item as GridEditFormItem).EditFormCell.Controls.AddAt(0, lbl); lbl := &Label.Create; lbl.ID := 'lblUpdateErrorBottom'; lbl.Visible := false; lbl.CssClass := 'label_error'; (e.Item as GridEditFormItem).EditFormCell.Controls.Add(lbl); end;}end;method TGridHelper.CreateColumnEditor(sender: System.Object; e: Telerik.Web.UI.GridCreateColumnEditorEventArgs);var UserField: TUserField; MaxLength: Integer; FieldName, Skin: String; ARadComboBoxItem: RadComboBoxItem; ARadComboBox: RadComboBox;begin if e.Column is GridBoundColumn then begin MaxLength := 0; UserField := FEasyIPConnection.FindUserField(TableTypeToTableName(FTableType), (e.Column as GridBoundColumn).DataField); if Assigned(UserField) then begin FieldName := (e.Column as GridBoundColumn).DataField.ToString; MaxLength := UserField.FieldSize; if UserField.FieldType in [TEIPDataType.edatString, TEIPDataType.edatWideString] then begin if UserField.LookupType <> TUserFieldLookupType.ltNone then begin e.ColumnEditor := new TCustomColumnEditor(concat('DropDown_', FieldName), TEditorType.etComboBox); ARadComboBox := ((e.ColumnEditor as TCustomColumnEditor).EditControl as RadComboBox); ARadComboBox.AllowCustomText := UserField.LookupType = TUserFieldLookupType.ltEditable; ARadComboBox.Items.Clear; for LookupItem in UserField.LookupList do begin ARadComboBoxItem := new RadComboBoxItem; ARadComboBoxItem.Value := LookupItem.Caption; ARadComboBoxItem.Text := LookupItem.Caption; if LookupItem.FontColour <> nil then ARadComboBoxItem.ForeColor := GetWebColor(Integer(LookupItem.FontColour)); if LookupItem.BackgroundColour <> nil then ARadComboBoxItem.BackColor := GetWebColor(Integer(LookupItem.BackgroundColour)); ARadComboBoxItem.Font.Bold := LookupItem.FontBold; ARadComboBoxItem.Font.Underline := LookupItem.FontUnderline; ARadComboBoxItem.Font.Italic := LookupItem.FontItalic; ARadComboBox.Items.Add(ARadComboBoxItem); end; ARadComboBoxItem := RadComboBoxItem.Create; ARadComboBoxItem.Value := ''; ARadComboBoxItem.Text := '[Blank]'; ARadComboBox.Items.Add(ARadComboBoxItem); ARadComboBox.MaxLength := MaxLength; end else if UserField.EditMask <> '' then begin e.ColumnEditor := new TCustomColumnEditor(concat('MaskEdit_', FieldName), TEditorType.etMaskedText); ((e.ColumnEditor as TCustomColumnEditor).EditControl as RadMaskedTextBox).Mask := UserField.EditMask; ((e.ColumnEditor as TCustomColumnEditor).EditControl as RadMaskedTextBox).MaxLength := MaxLength; end else begin e.ColumnEditor := new TCustomColumnEditor(concat('Edit_', FieldName), TEditorType.etText); ((e.ColumnEditor as TCustomColumnEditor).EditControl as RadTextBox).MaxLength := MaxLength; end; end else begin if UserField.FieldType in [TEIPDataType.edatWideMemo, TEIPDataType.edatMemo] then e.ColumnEditor := new TCustomColumnEditor(concat('TextBox_', FieldName), TEditorType.etMemo, Skin); end; end; end;end;method TGridHelper.FGridView_DeleteCommand(source: Object; e: GridCommandEventArgs);beginend;method TGridHelper.OpenGrid(const SearchText: String; const TableName: String; TableId: Int64; SearchOption: TSearchOption; FieldIds: Array of System.Int64);begin if TableName = 'SUBNETS' then begin FTableType := TTableType.ttSubnets; FDatatable := FEasyIPConnection.SearchTableBasic(TableId,SearchText,SearchOption,FieldIds); end else if TableName = 'ADDRESSES' then begin FTableType := TTableType.ttAddresses; FDatatable := FEasyIPConnection.SearchTableBasic(TableId,SearchText,SearchOption,FieldIds); end else if TableName = 'GLOBAL ARP TABLE' then begin FDatatable := FEasyIPConnection.SearchARPEntries(SearchText); end else begin // raise error end; // Load FDataset here (FDataset := FEasyIPConnection.SearchTableBasic(.... if FDatatable <> nil then begin FGridView.DataSource := FDatatable; FGridView.MasterTableView.DataMember := FDatatable.TableName; FGridView.Visible := TRUE; OpenGrid; end; end;method TGridHelper.OpenGrid(const TableName: String);begin FGridView.DataSource := FEasyIPConnection.GetUserFields(TableName.ToUpper());;; FGridView.MasterTableView.DataMember := FDatatable.TableName; FGridView.Visible := TRUE; OpenGrid; end;method TGridHelper.ItemCommand(sender: System.Object; e: Telerik.Web.UI.GridCommandEventArgs);begin if e.CommandName = RadGrid.EditCommandName then begin //OpenGrid; end; if e.CommandName = RadGrid.InitInsertCommandName then FGridView.MasterTableView.ClearEditItems(); if e.CommandName = RadGrid.UpdateCommandName then begin //UpdateCommand(sender,e); //var str : String; //str := "Update" end end;method TGridHelper.ItemUpdated(sender: System.Object; e: Telerik.Web.UI.GridUpdatedEventArgs); var EditedItem: GridEditableItem;begin EditedItem := e.Item as GridEditableItem;end;method TGridHelper.UpdateCommand(sender: System.Object; e: Telerik.Web.UI.GridCommandEventArgs);var EditedItem: GridEditableItem; Item : GridEditFormItem; SubnetId, KeyValue: Int64; NewValues: Hashtable; FieldNames: List<String>; FieldValues: List<Object>; TableName,PlantName: String; i: Integer;begin EditedItem := e.Item as GridEditableItem; FGridView.MasterTableView.ClearEditItems(); KeyValue := Int64(e.Item.OwnerTableView.DataKeyValues[e.Item.ItemIndex]['ID']); NewValues := new Hashtable; FieldNames := new List<String>; FieldValues := new List<Object>; if e.Item.IsInEditMode = true then begin var str : String; str := "Edit"; end; //The GridTableView will fill the values from all editable columns in the hash e.Item.OwnerTableView.ExtractValuesFromItem(NewValues, EditedItem); var IPAddress : String; IPAddress := (editedItem["Location"].Controls[1] as TextBox).Text; for Entry:DictionaryEntry in NewValues do begin FieldNames.Add(Entry.Key.ToString); FieldValues.Add(Entry.Value); end; case FTableType of TTableType.ttAddresses: TableName := 'ADDRESSES_USER_DATA'; TTableType.ttSubnets: TableName := 'SUBNETS_USER_DATA'; end; // case FEasyIPConnection.UpdateUserFields(TableName, KeyValue, FieldNames.ToArray, FieldValues.ToArray); (* ChangedRow := ChangedRows[0]; ChangedRow.BeginEdit; ATransaction := nil; try for Entry in newValues do begin FieldPropertiesItem
:=
SessionHelper.FieldPropertiesList.GetFieldPropertiesItem(Session['TableName'].ToString,
Entry.Key.ToString); if
(Assigned(FieldPropertiesItem)) and (FieldPropertiesItem.Mandatory) and
((not Assigned(Entry.Value)) or (Entry.Value.ToString = '')) then raise EEasyIPError.Create(system.string.Format(GetLocalisationString(105), [Entry.Key.ToString])); if not Assigned(entry.Value) then // Null cannot be assigned to ChangedRow ChangedRow[entry.Key.ToString] := DBNULL.Value else try ChangedRow[entry.Key.ToString] := entry.Value; except raise EEasyIPError.Create(system.string.format(GetLocalisationString(28), [entry.Value, entry.Key.ToString])); end; if SetSQL <> '' then SetSQL := concat(SetSQL, ','); SetSQL := system.string.format('{0}"{1}"=@P{2}', [SetSQL, entry.Key.ToString, ParamCounter.ToString]); SessionHelper.DBConnection.SQLCommand.Parameters.Add(FBParameter.Create(system.string.format('@P{0}',
[ParamCounter.ToString]), ChangedRow[entry.Key.ToString])); inc(ParamCounter); end; UpdateText := system.string.format(UpdateText, [SetSQL]); SessionHelper.ExecuteQuery(UpdateText); ChangedRow.EndEdit; SessionHelper.DBConnection.DataSet.AcceptChanges; SessionHelper.CommitTransaction; except on ex:Exception do begin ChangedRow.CancelEdit; e.Canceled := TRUE; SessionHelper.RollbackTransaction; With (e.Item as GridEditFormItem).FindControl('lblUpdateErrorTop') as &Label do begin Text := SessionHelper.DBConnection.TranslateException(ex); Visible := TRUE; end; With (e.Item as GridEditFormItem).FindControl('lblUpdateErrorBottom') as &Label do begin Text := SessionHelper.DBConnection.TranslateException(ex); Visible := TRUE; end; end; end; end;*)end;method TGridHelper.FGridView_UpdateCommand(source: Object; e: GridCommandEventArgs);beginend;On RadGrid1_UpdateCommand method when i try to get new values i got an error.
e.Item.OwnerTableView.ExtractValuesFromItem(NewValues, editedItem); --- Here i got an error.
Here i am also attache scree shot of trace value.
0
Hello Kaushal,
The problem is in the following line;
In order to use the DataKeyValues collection you should have set the DataKeyNames property of the grid first. You can do it the following way:
The property should be set to an existing field from your datasource. You can get more information from this help topic.
Best wishes,
Marin
the Telerik team
The problem is in the following line;
e.Item.OwnerTableView.DataKeyValues[e.Item.ItemIndex]['ID']In order to use the DataKeyValues collection you should have set the DataKeyNames property of the grid first. You can do it the following way:
<telerik:radgrid id="RadGrid1" runat="server" onneeddatasource="RadGrid1_NeedDataSource" DataKeyNames="ID" ...>The property should be set to an existing field from your datasource. You can get more information from this help topic.
Best wishes,
Marin
the Telerik team
Browse the vast support resources we have to jumpstart your development with RadControls for ASP.NET AJAX. See how to integrate our AJAX controls seamlessly in SharePoint 2007/2010 visiting our common SharePoint portal.
0
Kaushal
Top achievements
Rank 1
answered on 26 Nov 2010, 01:02 PM
Hi Marin ,
Thanks for your reply, i have already set DataKeyNames for grid in class file i had highlight that code also,please check once if i did anything wrong. and in updatemetho i didn't get erron to fetch datakey value but i got an error on
e.Item.OwnerTableView.ExtractValuesFromItem(NewValues, editedItem);
Please i couldn't understand and catch the sily mistakes as i did in my code and what is the reason behind this error.
Thanks
Kaushal
Thanks for your reply, i have already set DataKeyNames for grid in class file i had highlight that code also,please check once if i did anything wrong. and in updatemetho i didn't get erron to fetch datakey value but i got an error on
e.Item.OwnerTableView.ExtractValuesFromItem(NewValues, editedItem);
Please i couldn't understand and catch the sily mistakes as i did in my code and what is the reason behind this error.
Thanks
Kaushal
0
Hello Kaushal,
I see you set the DataKeyNames and add columns to the grid in the needDataSource event. This is not recommended approach, you should use the Page_Init or Page_Load events to add columns programmatically to the grid. NeedDatasource event should be used only to set the datasource property for the grid. You can check this help article for further information on how to add programmatically columns to the grid.
Also have you tried setting the datakeyNames in the markup for the grid since they always have the same value ("ID"). Moreover in the UpdateCommand event handler for the grid you can check whether the
Hope this helps.
All the best,
Marin
the Telerik team
I see you set the DataKeyNames and add columns to the grid in the needDataSource event. This is not recommended approach, you should use the Page_Init or Page_Load events to add columns programmatically to the grid. NeedDatasource event should be used only to set the datasource property for the grid. You can check this help article for further information on how to add programmatically columns to the grid.
Also have you tried setting the datakeyNames in the markup for the grid since they always have the same value ("ID"). Moreover in the UpdateCommand event handler for the grid you can check whether the
EditedItem variable has all the expected column (use editedItem["ColumnUniqueName"] ). Also when you perform custom update/insert/delete command you do not need this setting allowautomaticupdates="true" in the markup for the grid. It is required only if you leave the DataSource to perform the update operation automatically. Additionally you can first manually try getting the value for all the column (editedColumn["columnUniqueName"].Text) to see if all columns are accessible correctly and if so you can try calling the ExtractValueFromItem method.Hope this helps.
All the best,
Marin
the Telerik team
Browse the vast support resources we have to jumpstart your development with RadControls for ASP.NET AJAX. See how to integrate our AJAX controls seamlessly in SharePoint 2007/2010 visiting our common SharePoint portal.
0
Nguyen Anh Tai
Top achievements
Rank 1
answered on 16 Aug 2011, 09:38 AM
Hi all,
I have tried to use extractOldValuesFromItem and extractValuesFromItem methods in client code (javascript) based on help from Telerik official sites (http://www.telerik.com/help/aspnet-ajax/grid-gridtableview-extractvaluesfromitem.html and http://www.telerik.com/help/aspnet-ajax/grid-gridtableview-extractoldvaluesfromitem.html)
and they seem doesn't work as expected.
I receive "'id' is null or not an object" exception and some time null object, although there is data in my grid.
Could you provide me a running sample of using CLIENT extractOldValuesFromItem and extractValuesFromItem methods of masterTableView client object?
I already set DataKeyNames property of the grid. But my key field has different name than ID. Does it cause any trouble?
I have tried to use extractOldValuesFromItem and extractValuesFromItem methods in client code (javascript) based on help from Telerik official sites (http://www.telerik.com/help/aspnet-ajax/grid-gridtableview-extractvaluesfromitem.html and http://www.telerik.com/help/aspnet-ajax/grid-gridtableview-extractoldvaluesfromitem.html)
and they seem doesn't work as expected.
I receive "'id' is null or not an object" exception and some time null object, although there is data in my grid.
Could you provide me a running sample of using CLIENT extractOldValuesFromItem and extractValuesFromItem methods of masterTableView client object?
I already set DataKeyNames property of the grid. But my key field has different name than ID. Does it cause any trouble?
0
Hello Nguyen Anh Tai,
Please refer to this forum post for the answers to your questions.
In order to avoid duplicate posts, I suggest that we continue the communication in the other thread if necessary.
Regards,
Mira
the Telerik team
Please refer to this forum post for the answers to your questions.
In order to avoid duplicate posts, I suggest that we continue the communication in the other thread if necessary.
Regards,
Mira
the Telerik team
Browse the vast support resources we have to jump start your development with RadControls for ASP.NET AJAX. See how to integrate our AJAX controls seamlessly in SharePoint 2007/2010 visiting our common SharePoint portal.