【发布时间】:2014-12-12 15:23:29
【问题描述】:
我有一个在后面的代码中创建的表。在VB代码中,表基于选择组合值时从查询返回的数据填充表。该代码创建一行,其中包含两个单元格,一个用于标签,一个用于数据中每一行的下拉列表。我无法保留回发后为每一行创建的选定下拉列表值。
最初填充表时,我将数据存储在 ViewState 值中,并根据 PageLoad 中的这些设置重新创建表。问题是每次我更改下拉列表的值,然后通过单击保存设置导致回发发生时,所有设置都被错误地保存,因为它们甚至在调用保存之前就被还原了。
我希望在回发中维护这些值,但在选择新帐户时仍会更新数据库中的值。我尝试了几种方法来做到这一点,但我的代码遇到了两个问题:
当我在标记中的表上有 EnableViewState = "true" 时: 当我从组合框中选择一个项目以选择一个新帐户时,下拉列表中的选定值将保留,此时它们应该清除并使用新的数据库值。
当我在标记中的表上有 EnableViewState = "false" 时: 任何回发都会将下拉列表重置为其数据库值。即使单击立即回发以将值保存到数据库的“保存”,也只会重新保存它们当前的数据库值并忽略选定的值。
后面的代码:
Imports System.Data.SqlClient
Imports Telerik.Web.UI
Public Class AccountSettings2
Inherits Page
Private _selectedAccountID As Integer
Protected _truckPermissions As List(Of PermissionData2)
Private Sub Page_Init(sender As Object, e As EventArgs) Handles Me.Init
_truckPermissions = New List(Of PermissionData2)
If Not IsNothing(Session("SelectedAccountID")) Then
_selectedAccountID = Session("SelectedAccountID")
End If
If Not IsPostBack Then
Dim dtAccounts As New DataTable("Accounts")
Dim col1 As DataColumn = New DataColumn()
col1.DataType = System.Type.GetType("System.Int32")
col1.ColumnName = "AccountID"
dtAccounts.Columns.Add(col1)
Dim col2 As DataColumn = New DataColumn()
col2.DataType = System.Type.GetType("System.String")
col2.ColumnName = "Name"
dtAccounts.Columns.Add(col2)
Dim row1 As DataRow
Dim row2 As DataRow
Dim row3 As DataRow
Dim row4 As DataRow
row1 = dtAccounts.NewRow()
row1("AccountID") = 1
row1("Name") = "Account 1"
dtAccounts.Rows.Add(row1)
row2 = dtAccounts.NewRow()
row2("AccountID") = 2
row2("Name") = "Account 2"
dtAccounts.Rows.Add(row2)
row3 = dtAccounts.NewRow()
row3("AccountID") = 3
row3("Name") = "Account 3"
dtAccounts.Rows.Add(row3)
row4 = dtAccounts.NewRow()
row4("AccountID") = 4
row4("Name") = "Account 4"
dtAccounts.Rows.Add(row4)
rcbAccounts.DataValueField = "AccountID"
rcbAccounts.DataTextField = "Name"
rcbAccounts.DataSource = dtAccounts
rcbAccounts.DataBind()
End If
End Sub
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not IsPostBack Then
If _selectedAccountID > 0 Then
rcbAccounts.SelectedValue = _selectedAccountID
SelectAccount(_selectedAccountID)
End If
End If
End Sub
#Region "UI Updates"
Private Sub SelectAccount(accountID As Integer)
_selectedAccountID = accountID
Session("SelectedAccountID") = accountID
CreateTruckPermissionsData(accountID)
End Sub
Private Sub CreateTruckPermissionsData(accessTypeID As Integer)
tblTruckPermissions.Rows.Clear()
_truckPermissions.Add(New PermissionData2(1, "Permission 1", "Permission 1", accessTypeID))
_truckPermissions.Add(New PermissionData2(2, "Permission 2", "Permission 2", accessTypeID))
_truckPermissions.Add(New PermissionData2(3, "Permission 3", "Permission 3", accessTypeID))
_truckPermissions.Add(New PermissionData2(4, "Permission 4", "Permission 4", accessTypeID))
ViewState("_truckPermissions") = _truckPermissions
Dim dtAccessTypes As New DataTable("AccessTypes")
Dim col1 As DataColumn = New DataColumn()
col1.DataType = System.Type.GetType("System.Int32")
col1.ColumnName = "AccessTypeID"
dtAccessTypes.Columns.Add(col1)
Dim col2 As DataColumn = New DataColumn()
col2.DataType = System.Type.GetType("System.String")
col2.ColumnName = "Description"
dtAccessTypes.Columns.Add(col2)
Dim row1 As DataRow
Dim row2 As DataRow
Dim row3 As DataRow
Dim row4 As DataRow
row1 = dtAccessTypes.NewRow()
row1("AccessTypeID") = 1
row1("Description") = "Type 1"
dtAccessTypes.Rows.Add(row1)
row2 = dtAccessTypes.NewRow()
row2("AccessTypeID") = 2
row2("Description") = "Type 2"
dtAccessTypes.Rows.Add(row2)
row3 = dtAccessTypes.NewRow()
row3("AccessTypeID") = 3
row3("Description") = "Type 3"
dtAccessTypes.Rows.Add(row3)
row4 = dtAccessTypes.NewRow()
row4("AccessTypeID") = 4
row4("Description") = "Type 4"
dtAccessTypes.Rows.Add(row4)
For Each pd As PermissionData2 In _truckPermissions
Dim tr As New TableRow()
Dim td As New TableCell()
Dim td2 As New TableCell()
Dim l As New Label()
Dim ddl As New RadDropDownList()
l.Text = pd.Name
ddl.ID = "ddlTruckPermission" + pd.ID.ToString()
ddl.DataTextField = "Description"
ddl.DataValueField = "AccessTypeID"
ddl.DataSource = dtAccessTypes
ddl.DataBind()
ddl.SelectedValue = pd.HasAccess
td.Controls.Add(l)
td2.Controls.Add(ddl)
tr.Cells.Add(td)
tr.Cells.Add(td2)
tblTruckPermissions.Rows.Add(tr)
Next
End Sub
Private Sub RefreshTruckSettings()
If _selectedAccountID = 0 Then
Return
End If
For Each r As TableRow In tblTruckPermissions.Rows
For Each c As Control In r.Cells(1).Controls
If c.ID.Contains("ddlTruckPermission") Then
Dim ddl As RadDropDownList = DirectCast(c, RadDropDownList)
Dim pd As PermissionData2 = _truckPermissions.Find(Function(x) x.ID = Integer.Parse(ddl.ID.Substring(0 + "ddlTruckPermission".Length, ddl.ID.Length - "ddlTruckPermission".Length)))
If Not IsNothing(pd) Then
ddl.SelectedValue = pd.HasAccess
End If
End If
Next
Next
End Sub
#End Region
#Region "Events"
Protected Sub btnSavePermissions_Click(sender As Object, e As EventArgs)
If _selectedAccountID > 0 Then
Dim permissionUpdates As List(Of PermissionUpdate) = New List(Of PermissionUpdate)()
For Each r As TableRow In tblTruckPermissions.Rows
For Each c As Control In r.Cells(1).Controls
If c.ID.Contains("ddlTruckPermission") Then
Dim ddl As RadDropDownList = DirectCast(c, RadDropDownList)
permissionUpdates.Add(New PermissionUpdate(Integer.Parse(ddl.ID.LastIndexOf("ddlTruckPermission")), False, ddl.SelectedValue))
End If
Next
Next
' Code to save permissions to database
End If
End Sub
Protected Sub rcbAccounts_SelectedIndexChanged(sender As Object, e As RadComboBoxSelectedIndexChangedEventArgs)
Dim newIndex As Integer
If (Integer.TryParse(e.Value, newIndex)) Then
SelectAccount(newIndex)
End If
End Sub
#End Region
End Class
<Serializable>
Public Class PermissionData2
Private _id As Integer
Private _name As String
Private _description As String
Private _hasAccess As Integer
Public Property ID() As Integer
Get
Return _id
End Get
Set(value As Integer)
_id = value
End Set
End Property
Public Property Name() As String
Get
Return _name
End Get
Set(value As String)
_name = value
End Set
End Property
Public Property Description() As String
Get
Return _description
End Get
Set(value As String)
_description = value
End Set
End Property
Public Property HasAccess() As Integer
Get
Return _hasAccess
End Get
Set(value As Integer)
_hasAccess = value
End Set
End Property
Public Sub New()
_id = 0
_name = Name
_description = Description
_hasAccess = 0
End Sub
Public Sub New(id As Integer, name As String, description As String, hasAccess As Integer)
_id = id
_name = name
_description = description
_hasAccess = hasAccess
End Sub
End Class
aspx:
<%@ Page Language="vb" AutoEventWireup="false"
CodeBehind="AccountSettings2.aspx.vb" Inherits="AccountSettings2" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<link rel="stylesheet" type="text/css" href="styles/default.css" />
<title>Account Settings</title>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager runat="server" ID="ScriptManager1"></asp:ScriptManager>
<asp:UpdatePanel id="UpdatePanel1" runat="server" UpdateMode="Always">
<ContentTemplate>
<telerik:RadComboBox ID="rcbAccounts" runat="server" Height="200" Width="200"
DropDownAutoWidth="Enabled" EmptyMessage="Select an Account" HighlightTemplatedItems="true"
EnableLoadOnDemand="true" Filter="Contains"
OnSelectedIndexChanged="rcbAccounts_SelectedIndexChanged" AutoPostBack ="true"
Label="Accounts: " Skin="Office2010Silver" />
<asp:Table ID="tblTruckPermissions" runat="server" EnableViewState="true" />
<asp:Button ID="btnSavePermissions" runat="server" Text="Save" OnClick="btnSavePermissions_Click" />
</ContentTemplate>
</asp:UpdatePanel>
</form>
</body>
</html>
【问题讨论】: