GridView/ObjectDataSource внутри контейнера runat=server не привязывается

У меня есть небольшая веб-форма с двумя переключателями, назовите их PickFromList и EnterValue. Когда выбран PickFromList, я хочу показать GridView, который я настроил для привязки к ObjectDataSource. Когда установлен флажок EnterValue, я хочу, чтобы GridView исчез.

Эта форма выложена с использованием таблицы, и вы хотите скрыть/показать соответствующие строки на основе соответствующих данных и пользовательского ввода.

К сожалению, GridView не привязывается, когда в строке trPickFromList2 указаны идентификатор и атрибуты runat="server". Если я удалю id и runat="server" из строки trPickFromList2, он успешно привяжется.

Любые идеи?

<table id="tblOptions" runat="server">
    <tr id="trPickFromList1" runat="server">
        <td>
            <asp:RadioButton ID="rbFromList" runat="server" GroupName="Selection" 
                Text="Get Data From Existing Item" AutoPostBack="True" 
                oncheckedchanged="rbromList_CheckedChanged" />
        </td>
    </tr>
    <tr id="trPickFromList2" runat="server">
        <td style="padding-left:20px">
            <asp:GridView ID="gvList" runat="server" AutoGenerateColumns="False" 
                DataSourceID="odsList" Width="400px" onrowdatabound="gvList_RowDataBound">
                <Columns>
                    ...
                </Columns>
            </asp:GridView>
        </td>
    </tr>
    <tr id="trEnterValue1" runat="server">
        <td>
            <asp:RadioButton ID="rbEnterValue" runat="server" GroupName="Selection" 
                            Text="Create a New Item"
                            AutoPostBack="True" 
                            oncheckedchanged="rbEntered_CheckedChanged" />
        ...

person marc    schedule 30.10.2008    source источник


Ответы (6)


Почему бы вам просто не показать/не скрыть TR с помощью javascript? Таким образом, у вас не будет этой проблемы, и у вас будет гораздо более отзывчивый пользовательский интерфейс.

С jQuery:

$('.classOnShowRadioButton').click(function(){ $('.trToShow').show(); $('.trToHide').hide(); });

затем, очевидно, сделайте обратное для другого переключателя.

person Andrew Bullock    schedule 30.10.2008
comment
Это хорошее предложение. Нет веской причины, просто мы не большой магазин JavaScript. Есть некоторые дополнительные проблемы, такие как ошибки проверки при обратной передаче, которые также необходимо обрабатывать. - person marc; 30.10.2008

В итоге я реализовал элемент управления RowSelectorField от Wilco Bauwer, чтобы решить эту проблему. Это не идеальное решение, поскольку элементы управления отображают значение индекса выбранной строки, а не выбранное значение(я) ключа данных; тем не менее, это сработало хорошо.

person marc    schedule 04.11.2008

хм... не совсем уверен, но несколько раз меня смущало то, что для AutoWireEvents установлено значение false, это вверху в разделе ‹% page /%>. извините, если это не помогло, но что-то раздражающее и незначительное, как это, вероятно, является проблемой.

person the-undefined    schedule 30.10.2008

Если ответ AutoWireEvents, предложенный Джо, не является проблемой, вы также можете попробовать удалить runat=server из тегов tr и вместо этого обернуть их заполнителями и использовать заполнители для управления видимостью. (Обратите внимание, не используйте панели, так как это приведет к некорректному HTML)

person wulimaster    schedule 30.10.2008

Я заметил такое же поведение с FormView внутри тега TR с runat="server"

person devio    schedule 30.10.2008

По какой-то конкретной причине вы используете таблицу для макета? Попробуйте убрать все элементы управления из таблицы и сделать так, чтобы переключатели просто делали видимым/невидимым фактический GridView.

person sliderhouserules    schedule 30.10.2008
comment
Просто для целей выравнивания - 20px, чтобы подчинить сетку переключателю. - person marc; 30.10.2008
comment
Причина, по которой я спрашиваю, заключается в том, что вы превращаете свой TR в серверный объект, чтобы показать/скрыть его. Но ваш GridView уже является серверным объектом, и вы можете отображать/скрывать его самостоятельно. Единственное предостережение при этом заключается в том, что TR все равно будет отображаться (пустым). Без стола чище. - person sliderhouserules; 31.10.2008