Скрытие строки Gridview на основе результата хранимой процедуры в SQL Server VB.NET

У меня есть хранимая процедура в SQL Server, которая проверяет разрешения пользователя, который хочет увидеть мое представление сетки.

Процедура возвращает 1, если у них есть разрешение, и 0, если нет.

Я хочу показывать столбец «Заработная плата» только тем, у кого есть специальное разрешение. это моя страница aspx:

 'Hide Salary Column 
 Dim IsPermitted As Integer
 Using cmd As New SqlCommand("stored_procedure_IsPermitted")
     cmd.CommandType = CommandType.StoredProcedure
     cmd.Parameters.AddWithValue("@IDnumber", "4257673")
     cmd.Connection = con
     con.Open()
     IsPermitted = Convert.ToInt32(cmd.ExecuteScalar())
     con.Close()
 End Using
 If IsPermitted = 0 Then
     GridView.Columns("Salary").Visible = False -> this line gets the error
 Else
     GridView. Columns("Salary").Visible = True
 End If

Это мой код, и я не понимаю, почему я получаю эту ошибку:

Преобразование строки «Зарплата» в тип «Целое число» недопустимо».

Можете ли вы помочь?

Заранее большое спасибо.

Кстати dbdelta.com/addwithvalue-is-evil

Dale K 20.06.2024 10:56

отредактировал код, и я показываю, какая строка запускается при ошибке

RebeccaJohnson 20.06.2024 11:01

я не уверен, понятия не имею, как это исправить, можете ли вы что-нибудь порекомендовать?

RebeccaJohnson 20.06.2024 11:03

Я предполагаю, что вам нужен GridView.Columns[5], где 5 — это индекс, отсчитываемый от 0, в столбце зарплаты, или, может быть, GridView.Columns(5), я не использовал vb уже много лет.

siggemannen 20.06.2024 11:10
Learn.microsoft.com/en-us/dotnet/api/… кажется, вы можете индексировать его только по номеру... хотя не знаю, почему ваш компилятор не выдает исключение, вы даже не могли написать этот код в С#.
Dale K 20.06.2024 11:15

@DaleK, это почти наверняка потому, что в настройках проекта включен параметр Option Strict Off, который используется по умолчанию. Это позволяет выполнять неявные сужающие преобразования и позднее связывание, благодаря чему VB.NET работает так же, как VB6. Каждый должен установить Option Strict On в параметрах VS, поэтому он будет включен по умолчанию в будущих проектах, а также будет включен в текущих проектах. Благодаря этому VB.NET будет работать так же, как C#. Выключение означает, что новичкам не нужно слишком много думать о типах данных, что облегчает допущение подобных ошибок.

jmcilhinney 20.06.2024 13:40

GridView.Columns() ожидает в качестве параметра int32. Не такую ​​строку, как вы ее даете.

ClearlyClueless 20.06.2024 22:25
stackoverflow.com/questions/3925183/… есть ответ, необходимый для правильного получения столбца. Я рекомендую сделать этот метод расширения, чтобы упростить его, если вам позже понадобится получить столбец по заголовку или полю данных.
ClearlyClueless 20.06.2024 22:26
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
8
59
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Предполагая, что вы используете GridView, вы должны указать индекс столбца, к которому вы хотите получить доступ, начиная с 0, при доступе как Gridview.Columns(int32).

Для достижения желаемого я рекомендую следующее:

public module DataControlFieldCollectionExtensions
    ''' <summary>
    ''' Retrieves the first DataControlField from the GridView.Columns collection with the matching Header Text.
    ''' <exception cref = "ArgumentNullException" />
    ''' <exception cref = "InvalidOperationException" />
    ''' <param name = "dcfc">The DataControlFieldCollection to search.</param>
    ''' <param name = "ht">The headerText to search for.</param>
    ''' <returns>The first DataControlField with the headerText equal to ht or nothing if it does not exist.</returns>
    '''</summary>
<Extension()>
    Function FindByHeaderText(dcfc as DataControlFieldCollection, ht as string) as DataControlField
        if string.isNullOrEmpty(ht) then throw new NullArgumentException("Header text cannot be empty string")

        if dcfc.count = 0 then throw new InvalidOperationException("Column collection may not be empty.")

        For i as Integer = 0 to dcfc.Count-1
            if dcfc(i).HeaderText = ht then return dcfc(i)
        Next
    End Function

    return nothing
end module
    'Hide Salary Column 
    Dim IsPermitted As Integer
    Using cmd As New SqlCommand("stored_procedure_IsPermitted",con)
        cmd.CommandType = CommandType.StoredProcedure
        
        'don't use add with value
        cmd.Parameters.Add("@IDnumber",sqldbtype.nvarchar).value = "4257673"

        Try
            con.Open()
            IsPermitted = Convert.ToInt32(cmd.ExecuteScalar())
        Catch
            ' handle exceptions if desired or default IsPermitted to 0 to make sure that 
        Finally
            if con.state <> connectionState.closed then con.Close()
        End Try

    End Using

    Try
        dim salaryColumn = GridView.Columns.FindByHeaderText("Salary")
        if salaryColumn isnot nothing then salaryColumn.Visible = (IsPermitted = 1)
    Catch ex as exception
        'Do Something if exception thrown?
    End try
Ответ принят как подходящий

Столбцы GridView asp.net (веб-формы) нельзя индексировать или на них можно ссылаться по имени, но для GridView необходимо использовать целочисленное значение (индекс). Итак, вы передаете имя, а vb.net пытается преобразовать эту строку в число.

Итак, если вы использовали «2» или, еще лучше, 2, то это будет действительный целочисленный «индекс» в столбце.

Итак, вы можете просмотреть GridView, посчитать столбцы (начиная с 0) и ввести номер столбца. Скажем, вот так:

GridView.Columns(3).Visible = False

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

Следовательно, лучше всего просто использовать индекс, поскольку эти столбцы в любом случае могут не иметь текста заголовка.

Было бы полезно, если бы вы разместили разметку GridView, который вы сейчас используете.

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

Однако вы можете использовать процедуру поиска столбца по имени (например, предложенную в другом сообщении), которая будет возвращать столбец на основе переданного текста заголовка. Это позволит использовать имя столбца вместо целочисленного индексного номера для ссылки на столбцы в GridView. Итак, в вашем глобальном модуле вспомогательного кода вы можете использовать эту функцию:

Public Function GetColumnByName(MyColumns As DataControlFieldCollection,
                                sColumnName As String) As DataControlField

    Dim sResult As DataControlField = Nothing

    For Each dColumn As DataControlField In MyColumns
        If dColumn.HeaderText = sColumnName Then
            sResult = dColumn
            Exit For
        End If
    Next

    Return sResult

End Function

И тогда ваш код станет таким:

    If IsPermitted = 0 Then
        GetColumnByName(GridView1.Columns, "Salary").Visible = False
    Else
        GetColumnByName(GridView1.Columns, "Salary").Visible = True
    End If

Что можно сократить до:

GetColumnByName(GridView1.Columns, "Salary").Visible = (IsPermitted = 1)

Другие вопросы по теме