onCommand на кнопку не стреляет внутри gridView? - PullRequest
0 голосов
/ 23 апреля 2010

Это действительно сводит меня с ума.У меня есть кнопка внутри вида сетки, чтобы удалить этот элемент из вида сетки (его источником данных является список).У меня есть список, сохраняемый в сеанс каждый раз, когда в него вносятся изменения, и при проверке 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

    'If Not Session("associatedFaculty") Is Nothing Then'
    '   Dim associatedFacultyArray As User() = DirectCast(Session("associatedFaculty"), User())'
    '   associatedFaculty = associatedFacultyArray.ToList()'
    'End If'

    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))
    Session("associatedFaculty") = associatedFaculty.ToArray()
    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))
    Session.Add("associatedFaculty", associatedFaculty.ToArray())
    gvAssociatedUsers.DataBind()
    upAssociatedFaculty.Update()
End Sub

Protected Sub Delete(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.CommandEventArgs)

End Sub

Конечный класс

Разметка:

<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>
            &nbsp;<asp:Button ID="btnAddUser" runat="server" Text="Add Faculty" OnClientClick="incrementCounter();" /></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>

Теперь вот сумасшедшая часть, которой я просто поражен, если я раскомментирую блок If Not Session...of page_load, то deleteUser никогда не сработает при нажатии btnUnassignUser.Если я оставлю его закомментированным ... это не вызовет никаких проблем, но, конечно, в моем списке не может быть более одного элемента, поскольку я загружаю не сохраненный список из сеанса в сетку, а просто новый.Но нажатие кнопки регистрируется, поскольку при просмотре в режиме отладки page_load снова отображается, просто deleteUser никогда не срабатывает.

Почему это происходит ??И как я могу это исправить ??

1 Ответ

1 голос
/ 23 апреля 2010

Вы не хотите продолжать привязывать сетку. Вы хотите, чтобы сетка снова имела источник данных, но не сбрасывалась.

   gvAssociatedUsers.DataSource = associatedFaculty
   if (!Page.IsPostBack)
       gvAssociatedUsers.DataBind()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...