Как получить выбранную строку сетки деталей в Master-Detail GridView?

У меня возникла проблема с получением значений выбранных строк подробной сетки. У меня есть сетка master-detail во всплывающем окне, и она отлично работает. Я также включил возможность выбора, чтобы иметь флажки, но когда я пытаюсь запустить GetSelectedFieldValues ​​​​на ClientSideEvents кнопки, он всегда возвращает «0». Что я делаю не так, не нашел?

Вот подробная сетка:

                            AutoGenerateColumns="False"

CssFilePath="~/App_Themes/Aqua/{0}/styles.css"

                            CssPostfix="Aqua" 

                            OnBeforePerformDataSelect="gv_ParameterTempD_BeforePerformDataSelect"

ClientInstanceName="gvC_ParameterTempD">

                                <dxwgv:GridViewCommandColumn

ShowSelectCheckbox="True" VisibleIndex="0">

                                </dxwgv:GridViewCommandColumn>

                                <dxwgv:GridViewDataTextColumn

Caption="Задержать коду" FieldName="PrmDetailCode"

                                    VisibleIndex="0">

                                </dxwgv:GridViewDataTextColumn>

                                <dxwgv:GridViewDataTextColumn

Caption="Seçim Adı" FieldName="PrmDetailName"

                                    VisibleIndex="2">

                                </dxwgv:GridViewDataTextColumn>

                                <dxwgv:GridViewDataTextColumn

Caption="Seçim Adı(Grup)"

                                    FieldName="PrmDetailNameG"

ВидимыйИндекс="3">

                                </dxwgv:GridViewDataTextColumn>

                                <dxwgv:GridViewDataTextColumn

Caption="Seçim Adı(Сток)"

                                    FieldName="PrmDetailNameS"

ВидимыйИндекс="4">

                                </dxwgv:GridViewDataTextColumn>

                                <dxwgv:GridViewDataTextColumn

Caption="Группа Seçimi Yapan"

                                    FieldName="PrmGroupSelector"

ВидимыйИндекс="5">

                                </dxwgv:GridViewDataTextColumn>

                                <dxwgv:GridViewDataTextColumn

Caption="Сток Сечими Япан"

                                    FieldName="PrmStokSelector"

ВидимыйИндекс="6">

                                </dxwgv:GridViewDataTextColumn>

                            </Columns>

А это кнопка:

                <ClientSideEvents Click="function(s,e)

                {

                    pcc_Question.Hide();

                    gvC_ParameterTempD.GetSelectedFieldValues('PrmDetailName;PrmDetailNameG;PrmDetailNameS',ShowCellValue);

                }"

                />

            </dxe:ASPxButton>

and this is the jsscript:

функция ShowCellValue (значения) {

    var value = condition.GetText();

    alert(values.length); // here it returns "0"

    if(value != "")

    {

        var newValue = ' ' + value + values + ' = ';

        condition.SetText(newValue);

    }

    else

    {

        for(var i = 0; i < values.length; i ++) {

            value += values[i];

        }

        condition.SetText(value);

    }



}

Я не знаю, что я делаю неправильно,

Спасибо за помощь


person mehmetserif    schedule 07.07.2010    source источник


Ответы (4)


Правильно ли я предполагаю, что кнопка находится в том же контейнере DetailRowTemplate? В любом случае необходимо получить доступ к соответствующему экземпляру подробного объекта GridView. Для этого задайте для свойства сетки ClientInstanceName динамическое значение. Это должно позволить вам получить доступ к правильному экземпляру сетки и получить выбранные значения строки. Пример кода доступен по адресу:

http://www.devexpress.com/Support/Center/ViewIssue.aspx?issueid=Q90007

person DevExpress Team    schedule 07.07.2010
comment
Кнопка находится не в DetailRowTemplate, а вне сетки. - person mehmetserif; 07.07.2010
comment
Если это так, может быть много сеток деталей. Как вы решаете, какие значения сетки следует извлекать? - person DevExpress Team; 07.07.2010
comment
Есть только одна детальная сетка, а кнопка находится вне всех сеток, она находится в html-таблице. Определенного имени ClientInstanceName недостаточно? - person mehmetserif; 07.07.2010
comment
Хм, кажется, я вас не совсем понимаю. Вы используете две сетки отдельно? Или у вас есть подробная сетка, находящаяся в контейнере DetailRowTemplate главной сетки, как показано в демонстрациях DevExpress? В последнем случае количество сеток деталей в данный момент равно количеству видимых развернутых основных строк. Вот почему я предложил вам использовать подход с динамическим ClientInstanceName. - person DevExpress Team; 08.07.2010
comment
Нет, я не использую их отдельно, подробная сетка находится в DetailRowTemplate, но я хочу знать, важно ли иметь кнопку внутри DetailRowTemplate? Потому что, если она находится за пределами контейнера DetailRowTemplate.VisibleIndex не работает. Также в моем случае будет только одна мастер-сетка и детальная сетка. - person mehmetserif; 08.07.2010
comment
Если единовременно имеется только одна детальная сетка, ваш код должен работать нормально. Не обязательно иметь кнопку внутри контейнера шаблона. Пока у меня есть только две идеи: 1) убедиться, что для свойства AutoPostBack кнопки установлено значение false; 2) убедитесь, что при нажатии этой кнопки есть выбранные строки. Кроме того, я не вижу столбца с именем поля PrmDetailName. Но вы запрашиваете его значение в сценарии. - person DevExpress Team; 08.07.2010
comment
Да, есть столбец с именем поля PrmDetailName. Его VisibleIndex равен 2. Если кнопка находится за пределами DetailRowTemplate, как я могу установить VisibleIndex DetailGrid. Поскольку в событиях ClientSideEvents AspxButton Container.VisibleIndex не работает. - person mehmetserif; 08.07.2010
comment
Если кнопка находится за пределами TemplateContainer и развернута только одна основная строка (это очень важно) и в этой сетке есть выбранные строки, ваш код должен работать. Не вижу причин, чтобы он не работал. - person DevExpress Team; 08.07.2010
comment
Пожалуйста, дайте мне знать, как ваши сетки привязаны к источнику данных. т.е. вы установили свойство DataSourceID обеих сеток или вы устанавливаете свойство DataSource во время выполнения, а затем вызываете метод DataBind? В последнем случае разместите здесь свой код (интересно, когда вы устанавливаете свойство DataSource и когда вызываете DataBind). - person DevExpress Team; 08.07.2010
comment
Я написал, как я установил DataSource ниже. - person mehmetserif; 08.07.2010

Я устанавливаю DataSource во время выполнения, но я не вызываю метод DataBind, потому что он заставляет BeforePerformDataSelect Детальной сетки выполнять более одного.

Этот код устанавливает источник данных мастер-сетки и привязывает его:

protected void gv_Answers_CustomCallback (отправитель объекта, ASPxGridViewCustomCallbackEventArgs e) {

        ConfPrmMTempCollection _ConfPrmMTempCollection = new ConfPrmMTempCollection();
        masterKey = e.Parameters;

        if (masterKey != "")
        {
            man.Add(new SqlOperatorEquality("MAND_CONF_PRM_M_TEMP.PARAMETER_M_TEMP_ID", Convert.ToInt32(masterKey)));
            gv_Answers.DataSource = gc.LoadCollectionFromCollType(typeof(ConfPrmMTempCollection),man);
            gv_Answers.DataBind();

            man.Clear();

        }
    }

И этот код предназначен для установки источника данных сетки деталей:

protected void gv_ParameterTempD_BeforePerformDataSelect (отправитель объекта, EventArgs e) {

        ASPxGridView detailGrid = sender as ASPxGridView;

        masterKey = detailGrid.GetMasterRowKeyValue().ToString();
        man.Add(new SqlOperatorEquality("MAND_CONF_PRM_D_TEMP.PARAMETER_M_TEMP_ID", Convert.ToInt32(masterKey)));

        detailGrid.DataSource = gc.LoadCollectionFromCollType(typeof(ConfPrmDTempCollection),man);
    }
person mehmetserif    schedule 08.07.2010

Я вижу, что вы установили DataSource основной сетки в обработчике событий CustomCallback. Попробуйте кэшировать значение masterKey в переменной Session и установить DataSource сетки не только в обработчике события CustomCallback, но и в методе Page_Init:

protected void Page_Init(object sender, EventArgs e) {
    if(Session["masterKey"] == null)
      return;
    ConfPrmMTempCollection _ConfPrmMTempCollection = new ConfPrmMTempCollection();

            masterKey = Session["masterKey"].ToString();

            if (masterKey != "")
            {
                man.Add(new SqlOperatorEquality("MAND_CONF_PRM_M_TEMP.PARAMETER_M_TEMP_ID", Convert.ToInt32(masterKey)));
                gv_Answers.DataSource = gc.LoadCollectionFromCollType(typeof(ConfPrmMTempCollection),man);
                man.Clear();
            }

    }


    protected void Page_Load(object sender, EventArgs e) {
                gv_Answers.DataBind();
    }

Это помогает?

person DevExpress Team    schedule 08.07.2010
comment
Но эта сетка отображается в PopupControl, и есть еще одна сетка, показывающая этот PopupControl. Поэтому я не могу загрузить эту сетку на PageInit. Потому что данные загружаются по значению, переданному из первой сетки. - person mehmetserif; 09.07.2010
comment
Значение из основной сетки можно сохранить в переменной сеанса. Когда следующий запрос будет обработан, вы сможете получить его из сеанса и заполнить сетку данными на основе этого параметра. Я разместил код, прежде чем показать, как это можно сделать. Пожалуйста, попробуйте этот подход, он должен работать. - person DevExpress Team; 12.07.2010
comment
Этот код загружает сетку при загрузке страницы. Но сетка master-detail не отображается при загрузке страницы. Поэтому я могу сохранить значение в переменной сеанса, но мне это не помогает. Все, что я хочу сделать, это получить значение поля выбранной строки. Но я всегда получаю пустую переменную, GetSelectedFieldValues, похоже, не работает в моем случае. - person mehmetserif; 14.07.2010
comment
Я чувствую, что не совсем понимаю, как работает сетка в вашем приложении. Не могли бы вы подробно описать вашу задачу? Я попытаюсь воссоздать проблему на своей машине и сообщу вам решение. - person DevExpress Team; 14.07.2010
comment
Хорошо, на странице, загруженной данными, есть одна сетка, и когда вы дважды щелкаете по строке, появляется PopupControl. В этом PopupControl есть сетка Master-Detail, загружаемая по значению, переданному из сетки, которая находится на странице. Что я хочу сделать, так это то, что в подробной сетке пользователь будет выбирать строки и нажимать «Добавить в список». Так что все работает очень хорошо, пока не появится случай «Добавить в список». Я не могу получить значения полей в выбранной строке сетки сведений. Может быть, это не запутанная задача, но я действительно не мог этого сделать. Спасибо за вашу помощь. - person mehmetserif; 15.07.2010
comment
Вы успели создать проблему на своей машине? - person mehmetserif; 16.07.2010
comment
Пока нет :(. Я надеюсь воссоздать вашу конфигурацию локально к концу выходных. Кстати, какую версию вы используете? - person DevExpress Team; 16.07.2010
comment
Хорошо, это будет очень важная задача для меня, и я использую 9.2v DevExpress. - person mehmetserif; 16.07.2010

Я создал пример проекта на основе вашего описания, и он отлично работает. Он доступен для скачивания с:

http://www.devexpress.com/Support/Center/ViewIssue.aspx?issueid=Q220495

person DevExpress Team    schedule 20.07.2010
comment
Я не могу запустить проект, потому что моя версия devexpress 9.2, но вы использовали 10.1, поэтому я получил ошибку сборки, а версия .net, которую вы использовали, — 2.0, моя — .net 3.5. Что я могу сделать, чтобы отладить ваш проект? - person mehmetserif; 22.07.2010
comment
Вам следует использовать инструмент ProjectConverter (Start--›Developer Express v2009 vol 2--›Components--›Tools), входящий в состав Suite, чтобы обновить мой проект до вашей версии DXperience. Что касается .NET Framework 3.5. VS2008 должен открыть мой проект и обновить его. - person DevExpress Team; 22.07.2010
comment
Ваше решение работает нормально, но когда я пытаюсь преобразовать его в свой проект, я получаю эту ошибку: поле первичного ключа, указанное через свойство KeyFieldName, не найдено в базовом источнике данных. Это потому, что я использую коллекцию для загрузки источника данных? Или есть какие-то другие причины? Спасибо. - person mehmetserif; 24.07.2010