2017-01-30 3 views
1

У меня есть ASPxGridview, который содержит поле с ASPxComboBox. Я хочу получить выбранное значение ASPxComboBox и отобразить его на ярлыке. В моем коде ниже я просто храню значение в сообщении alert(). Но все, что я получаю, является «нулевым» значением. Кто-нибудь знает, как решить мою проблему? Огромное спасибо.DevExpress Получить выбранное значение ASPxComboBox в ClientSide

Вот что я до сих пор

<dx:ASPxGridView ID="ASPxGridView2" OnRowDataBound="ASPxGridView2_RowDataBound" ClientInstanceName="grid" runat="server" AutoGenerateColumns="False" DataSourceID="fordtl" KeyFieldName = "chndtl_no"> 

<dx:GridViewDataTextColumn FieldName="product" Name="dd_product" ShowInCustomizationForm="true" VisibleIndex="7"> 
<SettingsHeaderFilter> 
<DateRangePickerSettings EditFormatString="" /> 
</SettingsHeaderFilter> 
<EditItemTemplate> 
<dx:ASPxComboBox ID="ASPxComboBoxProduct" runat="server" ClientInstanceName="avery" AutoPostBack="true" DataSourceID="Product" EnableCallbackMode="true" TextField="pd_product"> 
<ClientSideEvents SelectedIndexChanged="function(s, e) { OnProductChanged(s);}"></ClientSideEvents> 
</dx:ASPxComboBox> 
</EditItemTemplate> 
</dx:GridViewDataTextColumn> 

</dx:ASPxGridView> 

JavaScript

function OnProductChanged(s, e) { 
    var getProduct = document.getElementById("ASPxComboBoxProduct"); 
    alert(getProduct); 
} 

ответ

1

Заменить это в вас ASPX код -

<ClientSideEvents SelectedIndexChanged="function(e,s) { OnProductChanged();}"> 
</ClientSideEvents> 

Заменить яваскрипта функцию от этого и проверить.

function OnProductChanged(e, s) 
{ 
     var selectedValue = e.lastSuccessValue; 
     alert(selectedValue); 
} 
+0

OMYGOD! Оно работает. Спасибо!!!!! –

0

Изменения обработчика SelectedIndexChanged JS к этому:

function OnProductChanged(s, e) { 
    var getProduct = s.GetValue(); 
    alert(getProduct); 
} 

Но если вы хотите изменить метку, хранящуюся в другом месте с вновь выбранными данными, как бы вы знать, какой именно сетку-х подряд значения выпадающего был изменен?

Комментарий, если это ваше требование, потому что у DX есть способ справиться с этим случаем.

UPDATE: Чтобы иметь возможность различать в какой строке выпадающий список из EditItemTemplate был выбранный индекс изменился, необходимо назначить уникальный ClientInstanceName для каждого такого ComboBox. Это ClientInstanceName должно содержать часть индекса строки, например: avery_01.

Чтобы быть в состоянии достигнуть этого вам нужно обрабатывать событие OnInit для КАЖДОГО выпадающего списка отображаются и назначить ClientInstanceName там, как, например, следующее:

... 
<EditItemTemplate> 
    <dx:ASPxComboBox ID="ASPxComboBoxProduct" runat="server" 
     OnInit="ASPxComboBoxProduct_Init" AutoPostBack="true" DataSourceID="Product" 
     EnableCallbackMode="true" TextField="pd_product"> 
    </dx:ASPxComboBox> 
</EditItemTemplate> 
... 

Примечание Я удалил атрибут ClientInstanceName и ClientSideEvents элемента.

То же должно быть сделано для вашего ASPxLabel помещается внутри ASPxGridView DataItemTemplate:

... 
<dx:GridViewDataColumn Caption="Label Column Caption"> 
<DataItemTemplate> 
    <ASPxLabel ID="ASPxLabel" runat="server" OnInit="ASPxLabel_Init" /> 
</DataItemTemplate> 
</dx:GridViewDataColumn> 
... 

Затем в коде добавления:

// Handle OnInit for each combobox being displayed 
protected void ASPxComboBoxProduct_Init(object sender, EventArgs e) 
{  
    ASPxComboBox dvxCombo = (ASPxComboBox)sender; 
    GridViewDetailRowTemplateContainer templateContainer = 
        (GridViewDetailRowTemplateContainer)ASPxGridView2.NamingContainer; 
    dvxCombo.ClientInstanceName = string.Format("avery_{0}", 
              templateContainer.VisibleIndex); 

    // below client instance name should set for the relevant label in the labels 
    //own OnInit handler below 
    string targetLabelClientInstanceName = string.Format("label_{0}", 
              templateContainer.VisibleIndex); 
    // Note, we're passing the ASPxLabel's ClientInstanceName as a third 
    // param to the SelectedIndexChanged event handler. 
    dvxCombo.ClientSideEvents.SelectedIndexChanged = 
     string.Format("function(s, e) {{ OnProductChanged(s, e, {0}); }}", 
     targetLabelClientInstanceName);   
} 


// Handle OnInit for each ASPxLabel which you will be updating with the 
// selected combobox value 
protected void ASPxLabel_Init(object sender, EventArgs e) 
{ 
    ASPxLabel dvxLabel = (ASPxLabel)sender; 
    GridViewDetailRowTemplateContainer templateContainer = 
        (GridViewDetailRowTemplateContainer)ASPxGridView2.NamingContainer; 
    dvxLabel.ClientInstanceName = string.Format("label_{0}", 
              templateContainer.VisibleIndex);  
} 

Затем обновите вас JavaScript обработчик как это:

function OnProductChanged(s, e, label) { 
    var getProduct = s.GetValue(); 
    alert(getProduct); 

    label.SetText(getProduct); 
} 

Примечание: выше label - это не просто строка или jQuery, это реальный объект клиента DevExpress для ASPxLabel, определенный в другом столбце сетки, в той же строке, что и текущее поле со списком, для которого это событие будет обработано. Поэтому все методы DX-клиента должны быть такими, как SetText() и GetText.

Таким образом, вышеуказанный подход был проверен на работу. Обратите внимание: все фрагменты кода, которые я ввел непосредственно без компиляции. Но я надеюсь, что вы сможете приклеить их вокруг.

Подобные случаи:

  1. Checking if a aspxgridview Master-Detail has any row checked in Client Side

  2. https://www.devexpress.com/Support/Center/Question/Details/Q372498

НТН

+0

Да, я скоро сохраню значение в ярлыке. И у меня еще 3 выпадающего списка. Есть ли у вас какая-либо идея о том, как узнать, какая выбранная величина изменилась? Спасибо. –

+0

@ x'tian Я представил образцы, как правильно обработать ваш случай. Если выше было полезно, я был бы признателен за принятие и голосование. Благодарю. – andrews

+0

Спасибо за образец. Я просто путаю, что, если я хочу сохранить значение в выпадающем списке? Я имею в виду, что значение второго раскрывающегося списка основывается на выбранном значении первого раскрывающегося списка, как и на каскаде. Но с удовольствием сначала попробовал бы ваш образец. Спасибо. :) –

0

Этикетка будет обновляться в то время как выпадающий событие изменения, но он потерял это значение на пост обратно , Избегайте отправки сообщения об изменении индекса combobox, затем метка будет обновляться по мере необходимости.

AutoPostBack="false"