muybn
muybn

Reputation: 291

ListView doesn't hit ItemInserting event

I have the following ListView that should raise an ItemInserting event, but as I step through the process, it never hits this event. Any clues? All the FindChild controls are found and values returned. I have searched for hours upon hours and don't understand why it's not working. Using ASP.Net 4.0.

<asp:SqlDataSource ID="srcSiteInvite" ConnectionString="<%$ ConnectionStrings:csRemote %>"
    SelectCommand="spSiteInvite" SelectCommandType="StoredProcedure"
    InsertCommand="INSERT INTO Friends(RequestSenderUserID, FriendFirstName, FriendLastName, FriendEmail) VALUES ( @User , @FirstName, @LastName, @Email)"
    runat="server">
    <InsertParameters>
        <asp:Parameter Name="User" />
        <asp:Parameter Name="FirstName" />
        <asp:Parameter Name="LastName" />
        <asp:Parameter Name="Email" />
    </InsertParameters>
</asp:SqlDataSource>


<asp:ListView ID="lsvSiteInvite" InsertItemPosition="FirstItem" DataSourceID="srcSiteInvite" OnItemInserting="lsvSiteInvite_ItemInserting" runat="server">
    <InsertItemTemplate>
        <tr>
            <td>
                <h3>Enter Friend Information</h3>
            </td>
        </tr>
        <tr>
            <td><asp:Label ID="lblFriendFirstName" Text="<b>First Name:</b>" Width="85px" runat="server" />
            <asp:TextBox ID="txtFriendFirstName" Text='<%# Bind("FriendFirstName") %>' runat="server" />
            <asp:RequiredFieldValidator ID="rfvFriendFirstName" ControlToValidate="txtFriendFirstName"
                ErrorMessage="Friend first name is required." runat="server"><span style="font-weight:bold; color:Red;">*</span>
            </asp:RequiredFieldValidator>
            </td>
        </tr>
        <tr>
            <td><asp:Label ID="lblFriendLastName" Text="<b>Last Name:</b>" Width="85px" runat="server" />
            <asp:TextBox ID="txtFriendLastName" Text='<%# Bind("FriendLastName") %>' runat="server" />
            <asp:RequiredFieldValidator ID="rfvFriendLastName" ControlToValidate="txtFriendLastName" 
                ErrorMessage="Friend last name is required." runat="server"><span style="font-weight:bold; color:Red;">*</span>
            </asp:RequiredFieldValidator>
            </td>
        </tr>
        <tr>
            <td><asp:Label ID="lblFriendEmail" Text="<b>E-mail:</b>" Width="85px" runat="server" />
            <asp:TextBox ID="txtFriendEmail" Text='<%# Bind("FriendEmail") %>' runat="server" />
            <asp:RequiredFieldValidator ID="rfvFriendEmail" ControlToValidate="txtFriendEmail" 
                ErrorMessage="Friend e-mail is required." runat="server"><span style="font-weight:bold; color:Red;">*</span>
            </asp:RequiredFieldValidator>
            <asp:RegularExpressionValidator ID="revFriendEmail" ControlToValidate="txtFriendEmail"
                ErrorMessage="E-mail is not in proper format." ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*" runat="server" />
            </td>
        </tr>
        <tr>
            <td>
                <asp:Button ID="btnFriendSubmit" CommandArgument="Insert" Text="Submit" runat="server" />
                <asp:Button ID="btnFriendCancel" CommandArgument="Cancel" Text="Cancel" OnClick="btnFriendCancel_Click" runat="server" />
            </td>
        </tr>
    </InsertItemTemplate>
...
</asp:ListView>


protected void lsvSiteInvite_ItemInserting(Object sender, ListViewInsertEventArgs e)
{
    TextBox txt = Helpers.FindChild(this, "txtFriendFirstName") as TextBox;
    e.Values["FirstName"]=txt.Text;
    txt = Helpers.FindChild(this, "txtFriendLastName") as TextBox;
    e.Values["LastName"] = txt.Text;
    txt = Helpers.FindChild(this, "txtFriendEmail") as TextBox;
    e.Values["Email"] = txt.Text;
    e.Values["User"] = UserInformation.UserID;
}

Upvotes: 1

Views: 2411

Answers (3)

Vikas Rana
Vikas Rana

Reputation: 1999

For Insert an Item You have to fire OnItemInserting event of listview. for this just o to properties of listview and double click on OnItemInserting go to code file and write your insert code in this method just like html is

<asp:ListView ID="lsvSiteInvite" InsertItemPosition="FirstItem" OnItemInserting="lsvSiteInvite_ItemInserting" DataSourceID="srcSiteInvite" runat="server">

and in code file

protected void lsvSiteInvite_ItemInserting(Object sender, ListViewInsertEventArgs e)
{
TextBox txt = Helpers.FindChild(this, "txtFriendFirstName") as TextBox;
e.Values["FirstName"]=txt.Text;
txt = Helpers.FindChild(this, "txtFriendLastName") as TextBox;
e.Values["LastName"] = txt.Text;
txt = Helpers.FindChild(this, "txtFriendEmail") as TextBox;
e.Values["Email"] = txt.Text;
e.Values["User"] = UserInformation.UserID;
}

See here the item inserting event of listview This event only fire. if a control having command name Insert is clicked

Upvotes: 0

muybn
muybn

Reputation: 291

This was what worked:

protected void lsvSiteInvite_ItemCommand(object sender, ListViewCommandEventArgs e)
{
    if (e.CommandName == "Insert")
    {
        ListViewItem item = (ListViewItem)e.Item;
        var firstName = item.FindControl("txtFriendFirstName") as TextBox;
        var lastName = item.FindControl("txtFriendLastName") as TextBox;
        var email = item.FindControl("txtFriendEmail") as TextBox;
        var userInfoList = UserInfo.UserInfoGetByUserID(UserID);
        UserInformation = userInfoList.FirstOrDefault();
        var user = UserInformation.UserID;
        if (firstName != null && lastName != null && email != null)
        {
            //Your code to insert
            srcSiteInvite.InsertParameters["User"].DefaultValue = user.ToString();
            srcSiteInvite.InsertParameters["FirstName"].DefaultValue = firstName.Text.ToString();
            srcSiteInvite.InsertParameters["LastName"].DefaultValue = lastName.Text.ToString();
            srcSiteInvite.InsertParameters["Email"].DefaultValue = email.Text.ToString();
        }
    }
}

Upvotes: 1

afzalulh
afzalulh

Reputation: 7943

You need to add OnItemInserting="lsvSiteInvite_ItemInserting" to your listview markup. This will bind the method to the OnItemInserting event:

EDIT 2 : You need to pass CommandName to the ListView. Change this line:

 <asp:Button ID="btnFriendSubmit" CommandArgument="Insert" Text="Submit" runat="server" />

To this:

<asp:Button ID="btnFriendSubmit" CommandName ="Insert" Text="Submit" runat="server" />

EDIT : In your markup you have a button with "Insert" command. Looks like you are expecting to trigger the ListView's OnItemInserting event. To use the button, you have to add OnItemCommand="lsvSiteInvite_ItemCommand" to your listview markup and in the code lsvSiteInvite_ItemCommand method will be called:

<asp:ListView ID="lsvSiteInvite" InsertItemPosition="FirstItem" 
DataSourceID="srcSiteInvite" OnItemCommand="lsvSiteInvite_ItemCommand" runat="server">

EDIT 3 : I have used the following code and markup to test your code. You can download my test project and DbScript here.

WebForm1.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="ListViewTest.WebForm1" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <asp:SqlDataSource ID="srcSiteInvite" ConnectionString="<%$ ConnectionStrings:csRemote %>"
    SelectCommand="spSiteInvite" SelectCommandType="StoredProcedure"
    InsertCommand="INSERT INTO Friends(RequestSenderUserID, FriendFirstName, FriendLastName, FriendEmail) VALUES ( @User , @FirstName, @LastName, @Email)"
    runat="server">
    <InsertParameters>
        <asp:Parameter Name="User" />
        <asp:Parameter Name="FirstName" />
        <asp:Parameter Name="LastName" />
        <asp:Parameter Name="Email" />
    </InsertParameters>
</asp:SqlDataSource>


<asp:ListView ID="lsvSiteInvite" InsertItemPosition="FirstItem" 
DataSourceID="srcSiteInvite" OnItemCommand="lsvSiteInvite_ItemCommand" runat="server">
    <InsertItemTemplate>
        <tr>
            <td>
                <h3>Enter Friend Information</h3>
            </td>
        </tr>
        <tr>
            <td><asp:Label ID="lblFriendFirstName" Text="<b>First Name:</b>" Width="85px" runat="server" />
            <asp:TextBox ID="txtFriendFirstName" Text='<%# Bind("FriendFirstName") %>' runat="server" />
            <asp:RequiredFieldValidator ID="rfvFriendFirstName" ControlToValidate="txtFriendFirstName"
                ErrorMessage="Friend first name is required." runat="server"><span style="font-weight:bold; color:Red;">*</span>
            </asp:RequiredFieldValidator>
            </td>
        </tr>
        <tr>
            <td><asp:Label ID="lblFriendLastName" Text="<b>Last Name:</b>" Width="85px" runat="server" />
            <asp:TextBox ID="txtFriendLastName" Text='<%# Bind("FriendLastName") %>' runat="server" />
            <asp:RequiredFieldValidator ID="rfvFriendLastName" ControlToValidate="txtFriendLastName" 
                ErrorMessage="Friend last name is required." runat="server"><span style="font-weight:bold; color:Red;">*</span>
            </asp:RequiredFieldValidator>
            </td>
        </tr>
        <tr>
            <td><asp:Label ID="lblFriendEmail" Text="<b>E-mail:</b>" Width="85px" runat="server" />
            <asp:TextBox ID="txtFriendEmail" Text='<%# Bind("FriendEmail") %>' runat="server" />
            <asp:RequiredFieldValidator ID="rfvFriendEmail" ControlToValidate="txtFriendEmail" 
                ErrorMessage="Friend e-mail is required." runat="server"><span style="font-weight:bold; color:Red;">*</span>
            </asp:RequiredFieldValidator>
            <asp:RegularExpressionValidator ID="revFriendEmail" ControlToValidate="txtFriendEmail"
                ErrorMessage="E-mail is not in proper format." ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*" runat="server" />
            </td>
        </tr>
        <tr>
            <td>
                <asp:Button ID="btnFriendSubmit" CommandName="Insert" Text="Submit" runat="server" />
                <asp:Button ID="btnFriendCancel" CommandArgument="Cancel" Text="Cancel" OnClick="btnFriendCancel_Click" runat="server" />
            </td>
        </tr>
    </InsertItemTemplate>
    <ItemTemplate>
        <br />
        <table>
            <tr><td>
        <asp:Label ID="Label1" Text="<b>First Name:</b>" Width="85px" runat="server" /></td><td>
        <asp:Label ID="lblFriendFirstName" Text='<%# Bind("FriendFirstName") %>' Width="85px" runat="server" /><br /></td></tr>
            <tr><td>
        <asp:Label ID="Label2" Text="<b>Last Name:</b>" Width="85px" runat="server" /></td><td>
        <asp:Label ID="lblFriendLastName" Text='<%# Bind("FriendLastName") %>' Width="85px" runat="server" /><br /></td></tr>
            <tr><td>
        <asp:Label ID="Label3" Text="<b>E-mail:</b>" Width="85px" runat="server" /></td><td>
        <asp:Label ID="lblFriendEmail" Text='<%# Bind("FriendEmail") %>' Width="85px" runat="server" /></td></tr>
        </table>
        <br />
    </ItemTemplate>
</asp:ListView>
    </div>
    </form>
</body>
</html>

WebForm1.ascx.cs:

using System;
using System.Web.UI.WebControls;

namespace ListViewTest
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void lsvSiteInvite_ItemCommand(object sender, ListViewCommandEventArgs e)
        {
            if (e.CommandName == "Insert")
            {
                ListViewItem item = (ListViewItem)e.Item;
                var firstName = item.FindControl("txtFriendFirstName") as TextBox;
                var lastName = item.FindControl("txtFriendLastName") as TextBox;
                var email = item.FindControl("txtFriendEmail") as TextBox;
                var user = "1";// UserInformation.UserID;//Test code

                if (firstName != null && lastName != null && email != null)
                {
                    //Your code to insert
                    srcSiteInvite.InsertParameters["User"].DefaultValue = user;
                    srcSiteInvite.InsertParameters["FirstName"].DefaultValue = firstName.Text.ToString();
                    srcSiteInvite.InsertParameters["LastName"].DefaultValue = lastName.Text.ToString();
                    srcSiteInvite.InsertParameters["Email"].DefaultValue = email.Text.ToString();
                }
            }
        }

        protected void btnFriendCancel_Click(object sender, EventArgs e)
        {

        }
    }
}

Here's the output I got from test: enter image description here

Upvotes: 2

Related Questions