Условное отображение пользовательской кнопки в DevExpress ASPxGridView в VB.NET

У меня есть элемент управления ASPxGridView, которому нужна кнопка, видимая на условной основе. Я искал и читал несколько статей, но не нашел решения для моей конкретной ситуации. Кнопка называется btnAllocatePlan и должна отображаться только в том случае, если значение в столбце PayPlanFlg истинно. Ниже приведена разметка для сетки и две вещи, которые я попробовал в отделенном коде, и именно здесь я бы предпочел это сделать. На самом деле ни одно из этих событий даже не сработало. Любая помощь приветствуется!

<dx:ASPxGridView ID="grdPayments" runat="server" CssClass="tblLined" SettingsPager-PageSize="50"
        AutoGenerateColumns="False" KeyFieldName="PaymentKey" Width="100%">
        <SettingsBehavior AllowFocusedRow="True" ProcessFocusedRowChangedOnServer="True" />
        <Columns>
            <dx:GridViewDataTextColumn Caption="CaseKey" FieldName="CaseKey" Visible="False" VisibleIndex="0">
            </dx:GridViewDataTextColumn>
            <dx:GridViewDataTextColumn Caption="Name" FieldName="Name" VisibleIndex="1" Width="10%">
            </dx:GridViewDataTextColumn>
            <dx:GridViewDataTextColumn Caption="Association" FieldName="AssociationName" VisibleIndex="2" Width="15%">
            </dx:GridViewDataTextColumn>
            <dx:GridViewDataTextColumn Caption="Address" FieldName="Address1" VisibleIndex="3" Width="15%">
            </dx:GridViewDataTextColumn>
            <dx:GridViewDataTextColumn Caption="Amount Paid" FieldName="Amount" VisibleIndex="4" Width="5%">
                <PropertiesTextEdit DisplayFormatString="c"></PropertiesTextEdit>
            </dx:GridViewDataTextColumn>
            <dx:GridViewDataTextColumn Caption="Payment Date" FieldName="TransactionTime" VisibleIndex="5" Width="12%">
            </dx:GridViewDataTextColumn>
            <dx:GridViewDataTextColumn Caption="Payment Type" FieldName="PaymentType" VisibleIndex="6" Width="3%">
            </dx:GridViewDataTextColumn>
            <dx:GridViewDataTextColumn Caption="Amount Owed" FieldName="Balance" VisibleIndex="7"  Width="5%">
                <PropertiesTextEdit DisplayFormatString="c">
                </PropertiesTextEdit>
            </dx:GridViewDataTextColumn>
            <dx:GridViewDataTextColumn Caption="Amount Available" FieldName="AmountAvailable" VisibleIndex="8" Width="6%">
                <PropertiesTextEdit DisplayFormatString="c">
                </PropertiesTextEdit>
            </dx:GridViewDataTextColumn>
            <dx:GridViewDataHyperLinkColumn Name="AllocationLink" VisibleIndex="9" Caption=" " UnboundType="String" Width="5%">
                <DataItemTemplate>
                    <!--<a href="javascript:OpenPaymentAllocation()"><%#"Allocate"%></a>-->
                    <dx:ASPxButton ID="btnAllocate" runat="server" Text="Allocate" OnClick="btnAllocate_Click" />
                </DataItemTemplate>
            </dx:GridViewDataHyperLinkColumn>
            <dx:GridViewDataHyperLinkColumn Name="PlanLink" VisibleIndex="10" Caption=" " UnboundType="String" Width="5%">
                <DataItemTemplate>
                    <!--<a href="javascript:OpenPaymentPlanAllocation()"><%#"Allocate"%></a>-->
                    <dx:ASPxButton ID="btnAllocatePlan" runat="server" Text="Pay Plan" OnClick="btnAllocatePlan_Click" />
                </DataItemTemplate>
            </dx:GridViewDataHyperLinkColumn>
            <dx:GridViewDataTextColumn Caption="PayPlanFlg" FieldName="PayPlanFlg" Visible="false" VisibleIndex="11">
            </dx:GridViewDataTextColumn>
        </Columns>            
    </dx:ASPxGridView>

Кодовые попытки:

Protected Sub grdPayments_CustomButtonInitialize(sender As Object, e As ASPxGridViewCustomButtonEventArgs)

        If e.Button.ID = "btnAllocatePlan" Then

            If grdPayments.GetRowValues(e.VisibleIndex, 11, "PayPlanFlg") = 1 Then

                e.Button.Visibility = GridViewCustomButtonVisibility.Invisible

            End If

        End If

    End Sub

Protected Sub ASPxGridView1_HtmlDataCellPrepared(sender As Object, e As ASPxGridViewTableDataCellEventArgs)

        If e.DataColumn.FieldName = "ID" Then
            Dim textBox As ASPxButton = TryCast(ASPxGridView1.FindRowCellTemplateControl(e.VisibleIndex, e.DataColumn, "btn"), ASPxButton)
            If Convert.ToString(e.GetValue("ItemName")).Equals("B") Then
                textBox.Text = Convert.ToString(e.CellValue)
                textBox.Visible = True
            Else
                textBox.Visible = False
            End If
        End If

    End Sub

person Mike    schedule 15.03.2017    source источник


Ответы (1)


Лучшим подходом является обработка события Init/Load кнопки. Этот рекомендуемый метод описан в разделе Общий метод использования обработчика событий Init/Load. статья базы знаний.

Ниже приведен пример кода для скрытия определенной кнопки в строке.

aspx

<dx:GridViewDataHyperLinkColumn Name="AllocationLink" VisibleIndex="9" Caption=" " UnboundType="String" Width="5%">
    <DataItemTemplate>
        <!--<a href="javascript:OpenPaymentAllocation()"><%#"Allocate"%></a>-->
        <dx:ASPxButton ID="btnAllocate" runat="server" Text="Allocate"  OnInit="btnAllocate_Init" />
    </DataItemTemplate>
</dx:GridViewDataHyperLinkColumn>

.cs

protected void btnAllocate_Init(object sender, EventArgs e)
{
    DevExpress.Web.ASPxButton btn = (DevExpress.Web.ASPxButton)sender;
    GridViewDataItemTemplateContainer container = btn.NamingContainer as GridViewDataItemTemplateContainer;

    // You can remove the if statement, and try to insert a new record. You'll catch an exception, because the DataBinder returns null reference
    if (container != null &&  !container.Grid.IsNewRowEditing)
        btn.Visible = !(bool)DataBinder.Eval(container.DataItem, "PayPlanFlg");
}

Ссылка:
ASPxGridView — условное скрытие элемента управления в DataItemTemplate

person Niranjan Singh    schedule 16.03.2017
comment
Спасибо за ответ, Ниранджан. Я попробовал ваш код, но получаю сообщение об ошибке, в котором говорится, что DevExpress.Web.ASPxButton не определен. Любые идеи, что вызывает это? - person Mike; 16.03.2017
comment
Я разобрался с этим вопросом. Я использую более старую версию DevExpress, когда ASPxButton все еще находился в пространстве имен ASPxEditors. - person Mike; 16.03.2017
comment
но ваша функциональность все та же. Просто измените пространство имен и обратитесь к коду, чтобы изменить его в соответствии с вашей версией DevExpress. - person Niranjan Singh; 17.03.2017