简体   繁体   中英

ASP.NET Dynamic Listview web application

I have several sqlserver tables each representing an application. I need to mantain (view/edit/insert/delete records) all of these tables. All of these application tables have an int primary key column named ID.

In order to accomplish this task, I created some SqlServer configuration tables which are the base to build a page to maintain these applications tables.

dbo.ApplGenerator_Applications: This table maps the application to the real SqlServer table with extra fields to sort data in the view pane of the web application.

CREATE TABLE [dbo].[ApplGenerator_Applications](
    [ApplicationName] [varchar](50) NOT NULL,
    [RealTable] [varchar](255) NOT NULL,
    [OrderBy] [varchar](255) NOT NULL,
    [Desc_OrderBy] [varchar](255) NOT NULL
)

As the primary key has always the same name and type, I don't need to add that information in the applications configuration table.

ApplGenerator_Master: This table is the base to: • Build an header with search capabilities • Build the list view columns • Build the query to retrive data

CREATE TABLE [dbo].[ApplGenerator_Master](
    [ApplicationName] [varchar](50) NOT NULL,
    [FieldId] [varchar](50) NOT NULL,
    [FieldTitle] [varchar](50) NULL,
    [FieldName] [varchar](255) NULL,
    [FieldAlign] [varchar](50) NULL,
    [FieldWidth] [varchar](50) NULL,
    [Position] [int] NULL
)

In conjunction, these two configuration tables are the base to build the listview objects (filter and data) and populate the data listview.

Master.aspx:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Master.aspx.cs" Inherits="ApplicationGenerator.Master" %>
<!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 runat="server">
    <link href="/Styles/StyleSheet.css" rel="stylesheet" type="text/css" />
    <script src="/Scripts/Script.js" type="text/javascript"></script>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <ajax:ToolkitScriptManager ID="MasterScriptManager" runat="server"></ajax:ToolkitScriptManager>
        <script type="text/javascript">
            document.body.onload = function () { resizeContent('pageContent'); }
            document.body.onresize = function () { resizeContent('pageContent'); }
        </script>
        <asp:UpdatePanel ID="myUpdatePanel" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="true">
        <ContentTemplate>
            <asp:DataPager ID="Master_Data_DataPager" runat="server"
                PagedControlID="Master_Data_ListView"
                PageSize="50">
                <Fields>
                    <asp:NextPreviousPagerField ButtonType="Image"
                                                FirstPageImageUrl="/Images/DataPager/first.png"
                                                NextPageImageUrl="/Images/DataPager/next.png"
                                                PreviousPageImageUrl="/Images/DataPager/previous.png"
                                                LastPageImageUrl="/Images/DataPager/last.png"
                                                ShowFirstPageButton="True"
                                                ShowNextPageButton="False" />
                    <asp:NumericPagerField />
                    <asp:NextPreviousPagerField ButtonType="Image"
                                                FirstPageImageUrl="/Images/DataPager/first.png"
                                                NextPageImageUrl="/Images/DataPager/next.png"
                                                PreviousPageImageUrl="/Images/DataPager/previous.png"
                                                LastPageImageUrl="/Images/DataPager/last.png"
                                                ShowLastPageButton="True"
                                                ShowPreviousPageButton="False" />
                </Fields>
            </asp:DataPager>
            <asp:ListView ID="Master_Filter_ListView" runat="server">
            </asp:ListView>
            <div id="pageContent" style="overflow:auto;">
                <asp:ListView ID="Master_Data_ListView" runat="server"
                    DataKeyNames="ID" DataSourceID="Master_Data_SqlDataSource"
                    OnPagePropertiesChanging="Master_Data_ListView_PagePropertiesChanging">
                </asp:ListView>
                <asp:SqlDataSource ID="Master_Data_SqlDataSource" runat="server"
                    ConnectionString="<%$ ConnectionStrings:ApplicationServices %>"
                    SelectCommand="dbo.ApplGenerator_Master_Data_GetList" SelectCommandType="StoredProcedure"
                    DeleteCommand="dbo.ApplGenerator_Master_DeleteRecord" DeleteCommandType="StoredProcedure"
                    OnSelecting="ApplicationUsersSqlDataSource_Selecting"
                    OnDeleting="ApplicationUsersSqlDataSource_Deleting">
                    <DeleteParameters>
                        <asp:Parameter Direction="Input" Name="ID" />
                    </DeleteParameters>
                </asp:SqlDataSource>
            </div>
        </ContentTemplate>
        </asp:UpdatePanel>
    </form>
</body>
</html>

Master.aspx.cs

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;

namespace ApplicationGenerator
{
    public partial class Master : System.Web.UI.Page
    {
        private static string sConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["ApplicationServices"].ToString();
        private static string sApplication = "";

        private static DataTable dtApplication = null;
        private static DataTable dtFilter = null;

        public struct ExternalReferencesStruct
        {
            public ListView DataListView;
        }

        public class myClass
        {
            private ExternalReferencesStruct classObjs;

            public myClass(ExternalReferencesStruct paramObjs)
            {
                classObjs = paramObjs;
            }
        }

        protected void Page_Init(object sender, EventArgs e)
        {
            sApplication = Request.QueryString["application"];

            dtApplication = ApplicationGenerator_Application_Get();
            dtFilter = ApplicationGenerator_Master_Filter_GetList();

            Build_MasterFilterListView();
            Build_MasterDataListView();

            Master_Filter_ListView.DataBind();
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            //if (!this.Page.IsPostBack)
            //{
                Master_Data_ListView.DataBind();
            //}
            string scriptString = "<script LANGUAGE='javascript'>resizeContent('pageContent');</script>";
            ScriptManager.RegisterStartupScript(this, this.GetType(), "myScript_Load", scriptString, false);
        }

        #region Master_Filtro_ListView
        public void Build_MasterFilterListView()
        {
            ExternalReferencesStruct ExternalObjs = new ExternalReferencesStruct();
            ExternalObjs.DataListView = Master_Data_ListView;

            Master_Filter_ListView.LayoutTemplate = new MasterFilterLayoutTemplate(ExternalObjs);
            Master_Filter_ListView.ItemTemplate = new MasterFilterItemTemplate();
            Master_Filter_ListView.EmptyDataTemplate = new MasterFilterLayoutTemplate(ExternalObjs);
        }

        public class MasterFilterLayoutTemplate : myClass, ITemplate
        {
            ExternalReferencesStruct ExternalReferences = new ExternalReferencesStruct();
            public MasterFilterLayoutTemplate(ExternalReferencesStruct paramExternalReferences)
                : base(paramExternalReferences)
            {
                ExternalReferences = paramExternalReferences;
            }

            protected void ApplyFilter_Click(object sender, ImageClickEventArgs e)
            {
                ExternalReferences.DataListView.DataBind();
            }

            public void InstantiateIn(System.Web.UI.Control container)
            {
                HtmlTable myTable = new HtmlTable();
                myTable.Width = "100%";
                myTable.Border = 0;
                myTable.CellPadding = 0;
                myTable.CellSpacing = 0;
                myTable.Style.Add("table-layout", "fixed");

                HtmlTableRow row = null;
                HtmlTableRow rowF = null;
                HtmlTableCell cell = null;
                TextBox tbFiltro = null;

                row = new HtmlTableRow();
                rowF = new HtmlTableRow();
                row.ID = "Row_Names";
                rowF.ID = "Row_Filters";

                ImageButton ib = null;

                //New Record
                cell = new HtmlTableCell();
                cell.Width = "20px";
                cell.Align = "center";
                    ib = new ImageButton();
                    ib.ID = "NewRecImageButton";
                    ib.ImageUrl = "/Images/Applications/New.png";
                    ib.ToolTip = "New Record";
                    ib.OnClientClick = "javascript:ViewEditDetail('" + sApplication + "', '-1');return false;";
                    cell.Controls.Add(ib);
                row.Cells.Add(cell);

                //Filter
                cell = new HtmlTableCell();
                cell.Width = "20px";
                cell.Align = "center";
                ib = new ImageButton();
                ib.ID = "FilterImageButton";
                ib.ImageUrl = "/Images/Applications/Filter.png";
                ib.ToolTip = "Apply Filtro";
                ib.Click += new ImageClickEventHandler(ApplyFilter_Click);
                cell.Controls.Add(ib);
                rowF.Cells.Add(cell);

                //Field Names
                foreach (DataRow dtrow in dtFilter.Rows)
                {
                    //Header - Field Titles
                    cell = new HtmlTableCell();
                    cell.Width = dtrow["FieldWidth"].ToString();
                    cell.Align = "center";
                    cell.Style.Add("font-weight", "bold");
                    cell.Controls.Add(new LiteralControl(dtrow["FieldTitle"].ToString()));
                    row.Cells.Add(cell);

                    //Header - Filter TextBoxes
                    cell = new HtmlTableCell();
                    cell.Width = dtrow["FieldWidth"].ToString();
                    tbFiltro = new TextBox();
                    tbFiltro.ID = dtrow["FieldId"].ToString();
                    tbFiltro.Width = new Unit("99%");
                    cell.Controls.Add(tbFiltro);
                    rowF.Cells.Add(cell);
                }
                myTable.Rows.Add(row);
                myTable.Rows.Add(rowF);

                //Container para Items
                row = new HtmlTableRow();
                row.ID = "itemPlaceholder";
                myTable.Rows.Add(row);

                container.Controls.Add(myTable);
            }
        }

        public class MasterFilterItemTemplate : ITemplate
        {
            public void InstantiateIn(System.Web.UI.Control container)
            {
            }
        }
        #endregion

        #region Master_Data_ListView
        public void Build_MasterDataListView()
        {
            ExternalReferencesStruct ExternalObjs = new ExternalReferencesStruct();
            ExternalObjs.DataListView = Master_Data_ListView;

            Master_Data_ListView.LayoutTemplate = new MasterDataLayoutTemplate(ExternalObjs);
            Master_Data_ListView.ItemTemplate = new MasterDataItemTemplate(ExternalObjs);
            Master_Data_ListView.EmptyDataTemplate = new MasterDataLayoutTemplate(ExternalObjs);
        }

        public class MasterDataLayoutTemplate : myClass, ITemplate
        {
            ExternalReferencesStruct ExternalReferences = new ExternalReferencesStruct();
            public MasterDataLayoutTemplate(ExternalReferencesStruct paramExternalReferences)
                : base(paramExternalReferences)
            {
                ExternalReferences = paramExternalReferences;
            }

            public void InstantiateIn(System.Web.UI.Control container)
            {
                HtmlTable myTable = new HtmlTable();
                myTable.Width = "100%";
                myTable.Border = 0;
                myTable.CellPadding = 0;
                myTable.CellSpacing = 0;
                myTable.Style.Add("table-layout", "fixed");

                HtmlTableRow row = null;
                HtmlTableCell cell = null;

                row = new HtmlTableRow();

                //Button Delete
                cell = new HtmlTableCell();
                cell.Width = "20px";
                cell.Align = "center";
                row.Cells.Add(cell);

                //Field Names
                foreach (DataRow dtrow in dtFilter.Rows)
                {
                    //Header - Field Names
                    cell = new HtmlTableCell();
                    cell.Width = dtrow["FieldWidth"].ToString();
                    row.Cells.Add(cell);
                }
                myTable.Rows.Add(row);

                //Item Container
                row = new HtmlTableRow();
                row.ID = "itemPlaceholder";
                myTable.Rows.Add(row);

                container.Controls.Add(myTable);
            }
        }

        public class MasterDataItemTemplate : myClass, ITemplate
        {
            ExternalReferencesStruct ExternalReferences = new ExternalReferencesStruct();
            public MasterDataItemTemplate(ExternalReferencesStruct paramExternalReferences)
                : base(paramExternalReferences)
            {
                ExternalReferences = paramExternalReferences;
            }

            public void InstantiateIn(System.Web.UI.Control container)
            {
                HtmlTableRow row = new HtmlTableRow();

                row.DataBinding += new EventHandler(row_DataBinding);

                DataRowView dataRowView = ((ListViewDataItem)container).DataItem as DataRowView;
                if (dataRowView != null)
                {
                    string sPK = dataRowView[0].ToString();
                    row.Attributes.Add("onclick", "ViewEditDetail('" + sApplication + "', '" + sPK + "');");
                    row.Attributes.Add("onmouseout", "MouseOut(this);");
                    row.Attributes.Add("onmouseover", "MouseOver(this);");
                    row.Attributes.Add("title", "View/Edit Details");
                    row.Style.Add("cursor", "pointer");
                }
                container.Controls.Add(row);
            }

            protected void row_DataBinding(object sender, EventArgs e)
            {
                HtmlTableRow row = (HtmlTableRow)sender;
                DataRowView dataRowView = ((ListViewDataItem)row.NamingContainer).DataItem as DataRowView;
                string sPK = dataRowView[0].ToString();

                HtmlTableCell cell = null;
                ImageButton ib = null;

                //Button Delete
                cell = new HtmlTableCell();
                cell.Width = "20px";
                cell.Align = "center";
                ib = new ImageButton();
                ib.ID = "DelImageButton";
                ib.CommandName = "Delete";
                ib.ImageUrl = "/Images/Applications/Delete.png";
                ib.ToolTip = "Delete Record";
                ib.OnClientClick = "javascript:return myConfirm('Proceed with Record Elimination?');";
                cell.Controls.Add(ib);
                row.Controls.Add(cell);

                int i = 1;
                foreach (DataRow dtrow in dtFilter.Rows)
                {
                    cell = new HtmlTableCell();
                    cell.Width = dtrow["FieldWidth"].ToString();
                    Literal MyLiteral = new Literal();
                    MyLiteral.Text = dataRowView[i++].ToString();

                    cell.Controls.Add(MyLiteral);
                    row.Controls.Add(cell);
                }
            }
        }
        #endregion

        #region Data Functions
        private static DataTable ApplicationGenerator_Application_Get()
        {
            string sStrSP = "";

            SqlConnection conn = null;
            SqlCommand cmd = null;
            SqlDataAdapter da = null;
            DataSet ds = null;

            sStrSP = "dbo.ApplGenerator_Application_Get";

            conn = new SqlConnection(sConnectionString);
            cmd = new SqlCommand();
            ds = new DataSet();
            cmd.Connection = conn;
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = sStrSP;
            cmd.Parameters.Add(new SqlParameter("@ApplicationName", sApplication));

            conn.Open();
            da = new SqlDataAdapter(cmd);
            da.Fill(ds);

            DataTable dt = ds.Tables[0];

            cmd.Dispose();
            da.Dispose();
            ds.Dispose();
            conn.Close();

            return dt;
        }

        private static DataTable ApplicationGenerator_Master_Filter_GetList()
        {
            string sStrSP = "";

            SqlConnection conn = null;
            SqlCommand cmd = null;
            SqlDataAdapter da = null;
            DataSet ds = null;

            sStrSP = "dbo.ApplGenerator_Master_Filter_GetList";

            conn = new SqlConnection(sConnectionString);
            cmd = new SqlCommand();
            ds = new DataSet();
            cmd.Connection = conn;
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = sStrSP;
            cmd.Parameters.Add(new SqlParameter("@ApplicationName", sApplication));

            conn.Open();
            da = new SqlDataAdapter(cmd);
            da.Fill(ds);

            DataTable dt = ds.Tables[0];

            cmd.Dispose();
            da.Dispose();
            ds.Dispose();
            conn.Close();

            return dt;
        }

        private static DataTable ApplicationGenerator_Master_Data_GetList(ListView FilterListView)
        {
            DataTable dtWhere = new DataTable();
            dtWhere.Clear();
            dtWhere.Columns.Add("FieldId");
            dtWhere.Columns.Add("FieldText");

            string sFilterId = "";
            string sFilterText = "";
            TextBox tbFilter = null;
            foreach (DataRow dtrow in dtFilter.Rows)
            {
                sFilterId = dtrow["FieldId"].ToString();
                tbFilter = (TextBox)FilterListView.Controls[0].FindControl(sFilterId);
                if (tbFilter != null)
                {
                    sFilterText = tbFilter.Text;
                    if (sFilterText != "")
                    {
                        DataRow dtWhereRow = dtWhere.NewRow();
                        dtWhereRow["FieldId"] = sFilterId;
                        dtWhereRow["FieldText"] = sFilterText;
                        dtWhere.Rows.Add(dtWhereRow);
                    }
                }
            }

            DataTable dt = new DataTable();

            SqlConnection conn = new SqlConnection(sConnectionString);
            SqlCommand cmd = null;
            conn.Open();

            try
            {
                string sStrSP = "dbo.ApplGenerator_Master_Data_GetList";
                cmd = new SqlCommand(sStrSP, conn);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add(new SqlParameter("@ApplicationName", sApplication));
                cmd.Parameters.Add(new SqlParameter("@dtWhere", dtWhere));

                SqlDataAdapter adapter = new SqlDataAdapter(cmd);
                adapter.Fill(dt);
            }
            finally
            {
                cmd.Dispose();
                if (conn != null)
                    conn.Close();
            }

            return dt;
        }
        #endregion

        #region Master_Data_ListView
        protected virtual void Master_Data_ListView_PagePropertiesChanging(object sender, PagePropertiesChangingEventArgs e)
        {
            string scriptString = "";

            Master_Data_DataPager.SetPageProperties(e.StartRowIndex, e.MaximumRows, false);
            Master_Data_ListView.DataBind();

            scriptString = "<script LANGUAGE='javascript'>resizeContent('pageContent');</script>";
            ScriptManager.RegisterStartupScript(this, this.GetType(), "myScript_PageChanging", scriptString, false);
        }
        #endregion

        #region Master_Data_SqlDataSource
        protected void ApplicationUsersSqlDataSource_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
        {
            DataTable dtWhere = new DataTable();
            dtWhere.Clear();
            dtWhere.Columns.Add("FieldId");
            dtWhere.Columns.Add("FieldText");

            string sFilterId = "";
            string sFilterText = "";
            TextBox tbFilter = null;
            foreach (DataRow dtrow in dtFilter.Rows)
            {
                sFilterId = dtrow["FieldId"].ToString();
                tbFilter = (TextBox)Master_Filter_ListView.Controls[0].FindControl(sFilterId);
                if (tbFilter != null)
                {
                    sFilterText = tbFilter.Text;
                    if (sFilterText != "")
                    {
                        DataRow dtWhereRow = dtWhere.NewRow();
                        dtWhereRow["FieldId"] = sFilterId;
                        dtWhereRow["FieldText"] = sFilterText;
                        dtWhere.Rows.Add(dtWhereRow);
                    }
                }
            }

            SqlParameter Param_Aplicacao = new SqlParameter("@ApplicationName", sApplication)
            {
                Direction = ParameterDirection.Input
            };

            SqlParameter Param_dtwhere = new SqlParameter("@dtWhere", dtWhere)
            {
                Direction = ParameterDirection.Input
            };

            e.Command.Parameters.Add(Param_Aplicacao);
            e.Command.Parameters.Add(Param_dtwhere);
        }

        protected void ApplicationUsersSqlDataSource_Deleting(object sender, SqlDataSourceCommandEventArgs e)
        {
            SqlParameter Param_Aplicacao = new SqlParameter("@ApplicationName", sApplication)
            {
                Direction = ParameterDirection.Input
            };

            e.Command.Parameters.Add(Param_Aplicacao);
        }
        #endregion
    }
}

The application is almost ready, the pager works fine The new and filter button (controls in the filter ListView) works as expected.

The problem is when I click the icon to delete a row (ImageButton Control in data ListView ItemTemplate), neither the code to delete runs, neither the data listview reloads.

Sourcecode VisualStudio2010

SqlServer2012 backup

I'm new to ASP.NET and for sure I'm doing somethig (very) wrong. I'm out of ideas on how to solve this issue. Can someone help?

Thanks,

Mário Nunes

You're dynamically creating controls in the ListView , problem is on PostBack those controls are lost (and so are their events) because the data has not been re-binded.

Try this quickly, see if that solves it:

protected void Page_Load(object sender, EventArgs e)
{
    //if (!this.Page.IsPostBack)
    //{
        Master_Data_ListView.DataBind();
    //}

Edit:

Nevermind I was looking at the wrong tag! :o

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM