У меня есть хранимая процедура в 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
Это мой код, и я не понимаю, почему я получаю эту ошибку:
Преобразование строки «Зарплата» в тип «Целое число» недопустимо».
Можете ли вы помочь?
Заранее большое спасибо.
отредактировал код, и я показываю, какая строка запускается при ошибке
я не уверен, понятия не имею, как это исправить, можете ли вы что-нибудь порекомендовать?
Я предполагаю, что вам нужен GridView.Columns[5], где 5 — это индекс, отсчитываемый от 0, в столбце зарплаты, или, может быть, GridView.Columns(5), я не использовал vb уже много лет.
@DaleK, это почти наверняка потому, что в настройках проекта включен параметр Option Strict Off, который используется по умолчанию. Это позволяет выполнять неявные сужающие преобразования и позднее связывание, благодаря чему VB.NET работает так же, как VB6. Каждый должен установить Option Strict On в параметрах VS, поэтому он будет включен по умолчанию в будущих проектах, а также будет включен в текущих проектах. Благодаря этому VB.NET будет работать так же, как C#. Выключение означает, что новичкам не нужно слишком много думать о типах данных, что облегчает допущение подобных ошибок.
GridView.Columns() ожидает в качестве параметра int32. Не такую строку, как вы ее даете.
Предполагая, что вы используете 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)
Кстати dbdelta.com/addwithvalue-is-evil