Кнопка скрытия / показа внутри ретранслятора условно из-за кода - PullRequest
0 голосов
/ 04 июня 2018

Я хочу показать / скрыть кнопку «Редактировать» внутри ретранслятора из-за условного кода, в соответствии с расширением файла в наборе данных.Но это берет последнее выполненное расширение файла и относится ко всем. Как обращаться с этим?Или мне нужно взять динамически сгенерированный идентификатор кнопки и обработать его?Как?

Код на ascx -

<asp:Repeater ID="rptProjectSubFolders" runat="server">
        <ItemTemplate>
            <asp:HiddenField runat="server" ID="fileID" ClientIDMode="Static" Value='<%# Container.DataItem("FileID") %>' />
<div style="width: 15%;text-align: right;"> 
                        <asp:LinkButton OnCommand="btnEditImage_Click" CssClass="link-button" Text="Edit Image" runat="server" ID="btn_ImageEdit"  CommandArgument='<%# Container.DataItem("FileID")%>' />
                    </div>
 </ItemTemplate>
    </asp:Repeater>

Код на коде позади

Public Sub rptProjectSubFolders_ItemDataBound()
    rptProjectSubFolders.DataSource = FolderHelper.ListAttachmentFiles(Me.ucFolderControl.objFolder.intID, Me.ucFolderControl.objFolder.intProjectID, Page.User.SiteUser.intID)
    rptProjectSubFolders.DataBind()
    Dim _ds1 As DataTable = New DataTable()
    _ds1 = rptProjectSubFolders.DataSource
    If _ds1.Rows.Count > 0 Then
        For i As Integer = 0 To _ds1.Rows.Count - 1
            For Each rptitem As RepeaterItem In rptProjectSubFolders.Items
                Dim EditImageLink = CType(rptitem.FindControl("btn_ImageEdit"), LinkButton)
                Dim fileExtension As String = _ds1.Rows(i).Item("FileExtension")
                If fileExtension = "jpg" OrElse fileExtension = "png" OrElse fileExtension = "jpe " OrElse fileExtension = "bmp" Then
                    ' EditImageLink.Visible = True
                    EditImageLink.Style.Add("Display", "Block")
                Else
                    ' EditImageLink.Visible = False
                    EditImageLink.Style.Add("Display", "None")
                End If
            Next
        Next
    End If

End Sub

enter image description here

1 Ответ

0 голосов
/ 04 июня 2018

Вы упоминаете, что

"он принимает расширение последнего исполняемого файла и применяется ко всем"

... потому что ItemDataBound выполняется много раз - один раз для каждый элемент данных, который вы передаете повторителю.

Тем не менее, внутри этого обработчика событий вы затем просматриваете все элементы повторителя (не только тот, который связан стекущее событие) и применить одно и то же изменение к каждому по очереди.Таким образом, к тому времени, когда вы выполнили ItemDataBound для каждого элемента данных, вы, конечно, увидите только результат, относящийся к последнему элементу, потому что это был последний раз, когда вы перебирали все элементы, и оннаписал любые предыдущие изменения.

Другая странная вещь заключается в том, что вы, кажется, повторно связываете свой Repeater внутри события ItemDataBound того же самого ретранслятора.Это не имеет смысла и кажется, что это создает круговой процесс.Повторитель должен быть привязан к базе данных только один раз во время запроса страницы, возможно, во время Page_Load или где-либо еще, что имеет смысл для вашего приложения.Вы должны переместить этот код куда угодно.

Если вы определили свое событие ItemDataBound со всеми аргументами, вы можете получить элемент ретранслятора current и просто воздействовать на элементы внутри этого ..Примерно так:

Sub rptProjectSubFolders_ItemDataBound(Sender As Object, e As RepeaterItemEventArgs)
    Dim EditImageLink = CType(rptitem.FindControl("btn_ImageEdit"), LinkButton)
    Dim fileExtension As String = CType(e.Item.DataItem, DataRow).Item("FileExtension")

    If fileExtension = "jpg" OrElse fileExtension = "png" OrElse fileExtension = "jpe " OrElse fileExtension = "bmp" Then
        EditImageLink.Visible = True
    Else
        EditImageLink.Visible = False
    End If
End Sub

См. https://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.repeater.itemdatabound(v=vs.110).aspx?cs-save-lang=1&cs-lang=vb#code-snippet-1 и https://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.repeateritemeventargs(v=vs.110).aspx для документации.

...