I've got a simple webhierarrchicaldatagrid and I'm trying to add columns dynamically to it after a dropdownlist is selected. No matter what I do I can only add columns to the grid from the initial page load. Is it possible to do this or is there a re-render I need to call after adding the columns?
Thanks
Hello Anthony,
Thank you for contacting Infragistics Support!We are currently looking into this matter and will keep you posted of any available information.Please do not hesitate to contact us with any updates or additional questions regarding this scenario in the meantime.
Not to keep adding little by little but I just realized this works perfectly with the WebDataGrid.
Yana, got a follow up question which should hopefully be simple. I'm using manual crud and trying to updating after each cell change. I've got that pretty much working except when the the RowUpdating event fires and I do my manual updates the grids datasource is being set in the page load with the dataset (like your example has it) and then the grid displays the old info.
Any thoughts or better ways to do this?
<ig:WebHierarchicalDataGrid ID="grdTestResults" runat="server" Height="350px" Width="100%" DataKeyFields="ID" DataMember="Parent" Key="Parent" AutoGenerateBands="False" EnableViewState="False" OnRowUpdating="grdTestResults_OnRowUpdating" AutoGenerateColumns="False"> <Columns> <ig:BoundDataField DataFieldName="TestDateTime" DataFormatString="{0:M/d/yyyy h:mm tt}" DataType="System.DateTime" Key="TestDateTime"> <Header Text="Test Date/Time"> </Header> </ig:BoundDataField> <ig:BoundDataField DataFieldName="Tech" Key="Tech"> <Header Text="Tech"></Header> </ig:BoundDataField> <ig:BoundDataField DataFieldName="LotNumber" Key="LotNumber"> <Header Text="Lot No"></Header> </ig:BoundDataField> <ig:BoundDataField DataFieldName="Line" Key="Line"> <Header Text="Line"></Header> </ig:BoundDataField> <ig:BoundDataField DataFieldName="PartNumber" Key="PartNumber"> <Header Text="Part No"></Header> </ig:BoundDataField> </Columns> <AjaxIndicator Enabled="True" /> <Bands> <ig:Band DataMember="Child" Key="Child" AutoGenerateColumns="False"> <Columns> <ig:BoundDataField DataFieldName="TestDateTime" DataFormatString="{0:M/d/yyyy h:mm tt}" DataType="System.DateTime" Key="TestDateTime"> <Header Text="Test Date/Time"> </Header> </ig:BoundDataField> <ig:BoundDataField DataFieldName="Tech" Key="Tech"> <Header Text="Tech"></Header> </ig:BoundDataField> <ig:BoundDataField DataFieldName="LotNumber" Key="LotNumber"> <Header Text="Lot No"></Header> </ig:BoundDataField> <ig:BoundDataField DataFieldName="Line" Key="Line"> <Header Text="Line"></Header> </ig:BoundDataField> <ig:BoundDataField DataFieldName="PartNumber" Key="PartNumber"> <Header Text="Part No"></Header> </ig:BoundDataField> </Columns> </ig:Band> </Bands> <Behaviors> <ig:Activation> <ActivationClientEvents ActiveCellChanged="grdTestResults_Activation_ActiveCellChanged" /> </ig:Activation> <ig:EditingCore AutoCRUD="False"> <Behaviors> <ig:CellEditing> <ColumnSettings> <ig:EditingColumnSetting ColumnKey="TestDateTime" EditorID="e_DateTimePicker" /> </ColumnSettings> </ig:CellEditing> </Behaviors> </ig:EditingCore> </Behaviors> <EditorProviders> <ig:DatePickerProvider ID="e_DateTimePicker"> <EditorControl runat="server" DisplayModeFormat="g" EditModeFormat="g" DropDownCalendarID="WebMonthCalendar1" EnableAjaxViewState="False"> <AutoPostBackFlags ValueChanged="On" /> </EditorControl> </ig:DatePickerProvider> </EditorProviders> </ig:WebHierarchicalDataGrid>
can you please send me the whole project with the code behind, so that I will be able to investigate the problem with the Manual CRUD?
I think I figured this out. I've got the page load
if (Session["data"] != null) { grdTestResults.DataSource = (DataSet)Session["data"]; grdTestResults.DataBind(); }
Then in the row updating I'm doing my updates then re-querying the data then doing a clear datasource and reseting.
grdTestResults.GridView.ClearDataSource(); grdTestResults.DataSource = (DataSet)Session["data"]; grdTestResults.DataBind();
Is this the preferred way to do this?
Separate question; I've got a NumericEditorProvider I can't get it to postback on value change when the cell is left through either the RowUpdating or the OnValuechanged event.
<ig:NumericEditorProvider ID="grdTestResults_NumericEditorProvider1"> <EditorControl ClientIDMode="Predictable" DataMode="Decimal" OnValueChanged="OnValueChanged"> <AutoPostBackFlags ValueChanged="On" /> </EditorControl> </ig:NumericEditorProvider>
Thanks again
Additional question, I'm adding a dropdownprovider on one of the dynamically added columns but it doesn't seem to be doing anything, do you see anything that sticks out?
var wddProvider = new DropDownProvider() { ID = "wdd" + col.Key }; wddProvider.EditorControl.DataSource = selectionValues; wddProvider.EditorControl.DataBind(); wddProvider.EditorControl.DataKeyFields = "SelectionValue"; wddProvider.EditorControl.ValueField = "SelectionValue"; wddProvider.EditorControl.TextField = "SelectionValue"; wddProvider.EditorControl.DisplayMode = DropDownDisplayMode.DropDownList; grdTestResults.EditorProviders.Add(wddProvider);
grdTestResults.Behaviors.EditingCore.Behaviors.CellEditing.ColumnSettings.Add(new EditingColumnSetting(grdTestResults.GridView) { ColumnKey = col.Key, EditorID = wddProvider.ID });
I will need some time to research this and I will let you know about the solution as soon as possible.
I was able to get this working. I turned off all the auto-postback and just added a client side CellValueChanged which just commits the changed and this seems to be more consistant.
function grdTestResults_Editing_CellValueChanged(sender, eventArgs) { var row = eventArgs.get_cell().get_row(); if (row.get_index() != -1) { var webDataGrid = $find('<%=grdTestResults.ClientID %>').get_gridView(); if (webDataGrid.get_rows().get_length() > 0) { var editingCore = webDataGrid.get_behaviors().get_editingCore(); editingCore.commit(); } } }
Hi Yana, got another question for you; by just adding wddProvider.EditorControl.AutoPostBackFlags.ValueChanged = Infragistics.Web.UI.AutoPostBackFlag.On; to your sample when adding the dropdownprovider i'm getting a view state error.
My end result would be that when the dynamic dropdownprovider valuechanged it would postback and get into the rowupdating event. The idea behind this is when any cell is changed it will save an audit record to have a detailed history of changes (which is being displayed in the child table).
Thanks again, that was it. I forgot the .GridView and then I was able to get the dropdown to work with one small change to your example; I had to move the .DataBind() after setting the field names. If I did databind before it would just should the object.tostring() value like "system.data.datarowview"
as to the first question about the updating, re-querying the data, clearing the datasource and reseting is a good way for doing that.
I modified the sample, as I added a DropDownProvider and it works properly in this scenario. I guess that the problem in your code could be the missed Gridview, which comes with the WebHieararchicalGrid behaviors and EditorProviders. If you need additional information, please contact us.