I have a WebDataGrid with 2 columns, A & B.
Column A is readonly.
Column B has a DropDownProvider to pick the value.
I want the data items in B to be dependent on the value in A. So for example:If A = 1, then B = {red, pink, salmon}If A = 2, then B = {blue, cyan, turquoise}etc.
I have gotten the behavior I want using Load-on-Demand on column B, i.e: loadItems(A.value, false).However, this forces me to Load-on-Demand each time I open the drop down which makes the UI a bit slow.
Is there a better way to do this? Maybe use Load-on-Demand, but somehow cache the results on the client side? Any ideas?
Hi Tsvetelina,
I came across this post, and try to get the dropdownprovider value in the 'data adding row' from server too.
But I found that the following code doesn't work for me, as my webDropDown.Parent is WebDataGrid which doesn't match "TemplateContainer", do you mind to advise as well?
TemplateContainer container = (TemplateContainer)webDropDown.Parent;
Thanks,
BH
I managed to get the behavior I wanted. I switched back to my original method of using DropDownProvider controls that load on demand based on the value of the ColorID column. It works great other than the AjaxIndicator doesn't display while loadItems is being called, so if the database call takes a while, the user is able to select the old Shades while the new shades are loading.
I started a new thread for the AjaxIndicator issue: http://community.infragistics.com/forums/t/57351.aspx
Hello ,
Let us know if you need further assistance regarding this.
Hello ssd,
Thank you for the update.
You are correct, in this case you should move the logic to the server side.
There you can access the parent container and respectively the row item
Then you can access the value of the first row item and get the colored.
protected void WebDropDown1_ItemsRequested(object sender, DropDownItemsRequestedEventArgs e)
{
Control webDropDown = (Control)sender;
GridRecordItem item = (GridRecordItem)container.Item;
GridRecord row = item.Row;
DataTable dt = SampleData.GetShadeDataTable();
int colorId = (int)row.Items[0].Value;
// find the shades that match the passed ColorId
DataRow[] shades = dt.Select("ColorId = " + colorId.ToString());
for (int i = dt.Rows.Count - 1; i >= 0; i--)
if (!shades.Contains(dt.Rows[i]))
dt.Rows.RemoveAt(i);
}
WebDropDown wdd = (WebDropDown)sender;
wdd.Items.Clear();
wdd.DataSource = dt;
wdd.DataBind();
// simulate a long database call
System.Threading.Thread.Sleep(1000);
Regarding the ajax indicator, the WebDropDown is smart and shows it when the request is time-consuming.
In your case you simulate this by putting to sleep the thread so you should manually show the ajax indicator:
function WebDropDown1_DropDownOpening(sender, eventArgs) {
///<summary>
///
///</summary>
///<param name="sender" type="Infragistics.Web.UI.WebDropDown"></param>
///<param name="eventArgs" type="Infragistics.Web.UI.DropDownContainerEventArgs"></param>
if (sender.get_items().getLength() == 0) {
sender.get_ajaxIndicator().setRelativeContainer(sender.get_element());
sender.get_ajaxIndicator().set_location(9);
sender.loadItems("", false);
sender.get_ajaxIndicator().show();
Please refer to the modified code provided .Let us know if you need further assistance regarding this.
Hi Tsvetelina,Thanks for the suggestion. It helps a bit, but it raises a few more issues.
I was able to update my grid and make the Shade column a template field with individual WebDropDown controls. However, now my row does not get selected when I open a WebDropDown, which means my getActiveGridRow() JavaScript function no longer works. For my production app, I need to know which row the the WebDropDown is in. Is there a way I can find and activate the WebDropDown's parent GridRow during the DropDownOpening event?
Also, can you tell me why the AjaxIndicator isn't showing my DropDownProviders?