Нет, это не копия этого вопроса: Кнопка на панели обновления выполняет полную обратную передачу?
У меня есть выпадающий список на панели обновлений, и я пытаюсь получить его, чтобы человек, использующий страницу, мог добавлять пользователей в список, связанный с сеткой. Список является глобальной переменной, и на page_load я установил его в качестве источника данных gridview и привязал к нему данные. Однако в любое время я нажимаю кнопку «добавить пользователя» или кнопку, чтобы удалить пользователя из списка. Похоже, что он делает полный пост обратно, хотя все эти элементы находятся внутри панели обновления.
Код сзади:
Public accomplishmentTypeDao As New AccomplishmentTypeDao()
Public accomplishmentDao As New AccomplishmentDao()
Public userDao As New UserDao()
Public facultyDictionary As New Dictionary(Of Guid, String)
Public facultyList As New List(Of User)
Public associatedFaculty As New List(Of User)
Public facultyId As New Guid
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Page.Title = "Add a New Faculty Accomplishment"
ddlAccomplishmentType.DataSource = accomplishmentTypeDao.getEntireTable()
ddlAccomplishmentType.DataTextField = "Name"
ddlAccomplishmentType.DataValueField = "Id"
ddlAccomplishmentType.DataBind()
facultyList = userDao.getListOfUsersByUserGroupName("Faculty")
For Each faculty As User In facultyList
facultyDictionary.Add(faculty.Id, faculty.LastName & ", " & faculty.FirstName)
Next
If Not Page.IsPostBack Then
ddlFacultyList.DataSource = facultyDictionary
ddlFacultyList.DataTextField = "Value"
ddlFacultyList.DataValueField = "Key"
ddlFacultyList.DataBind()
End If
gvAssociatedUsers.DataSource = associatedFaculty
gvAssociatedUsers.DataBind()
End Sub
Protected Sub deleteUser(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.CommandEventArgs)
facultyId = New Guid(e.CommandArgument.ToString())
associatedFaculty.Remove(associatedFaculty.Find(Function(user) user.Id = facultyId))
gvAssociatedUsers.DataBind()
upAssociatedFaculty.Update()
End Sub
Protected Sub btnAddUser_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnAddUser.Click
facultyId = New Guid(ddlFacultyList.SelectedValue)
associatedFaculty.Add(facultyList.Find(Function(user) user.Id = facultyId))
gvAssociatedUsers.DataBind()
upAssociatedFaculty.Update()
End Sub
Markup:
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<asp:UpdatePanel ID="upAssociatedFaculty" runat="server"
UpdateMode="Conditional">
<ContentTemplate>
<p><b>Created By:</b> <asp:Label ID="lblCreatedBy" runat="server"></asp:Label></p>
<p><b>Accomplishment Type: </b><asp:DropDownList ID="ddlAccomplishmentType" runat="server"></asp:DropDownList></p>
<p><b>Accomplishment Applies To: </b><asp:DropDownList ID="ddlFacultyList" runat="server"></asp:DropDownList>
<asp:Button ID="btnAddUser" runat="server" Text="Add Faculty" /></p>
<p>
<asp:GridView ID="gvAssociatedUsers" runat="server" AutoGenerateColumns="false"
GridLines="None" ShowHeader="false">
<Columns>
<asp:BoundField DataField="Id" HeaderText="Id" Visible="False" />
<asp:TemplateField ShowHeader="False">
<ItemTemplate>
<span style="margin-left: 15px;">
<p><%#Eval("LastName")%>, <%#Eval("FirstName")%>
<asp:Button ID="btnUnassignUser" runat="server" CausesValidation="false"
CommandArgument='<%# Eval("Id") %>' CommandName="Delete" OnCommand="deleteUser" Text='Remove' /></p>
</span>
</ItemTemplate>
</asp:TemplateField>
</Columns>
<EmptyDataTemplate>
<em>There are currently no faculty associated with this accomplishment.</em>
</EmptyDataTemplate>
</asp:GridView>
</p>
</ContentTemplate>
</asp:UpdatePanel>
Теперь я подумал, что смысл панели обновлений в том, чтобы иметь возможность обновлять вещи внутри нее, не делая полного post_back и не перезагружая страницу. Так что, если это так, почему он вызывает page_load каждый раз, когда я нажимаю на кнопки? Я запустил этот код и отладил, и я вижу, что даже до того, как любой код, связанный с нажатием кнопки, снова запускается page_load.
Я попытался поместить gvAssociatedUser.Datasource = associatedFaculty
и строку ниже в проверку Page.IsPostBack
, которая мешала работе страницы. Я перепробовал каждую комбинацию настроек панели обновлений для ChildrenAsTriggers и UpdateMode, и ни одна из них не сработала.
Я знаю, что это что-то простое, но все комбинации, которые я пробовал, не заставят его работать. Как я могу заставить эту вещь работать?
Отредактировано: Это не вызывало полную обратную передачу, поэтому я был не прав относительно причины. Я думал, что страница делала полный пост обратно, таким образом сбрасывая глобальную переменную списка связанных списков, но она не делала полный постбэк.
Проблема, с которой я сталкиваюсь, заключается в том, что каждый раз, когда я нажимаю btnAddUser
, он добавляет один элемент в список associatedFaculty
и, таким образом, связывается с gvAssociatedusers
. Это работает в первый раз, но во второй раз, когда я нажимаю на него, он перезаписывает первый элемент. Похоже, мой список связанных с ним сбрасывается каждый раз, когда я нажимаю кнопку?