обработка событий в динамическoм table asp.net

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

Здраствуйте коллеги. Я новичек в ASP и столкулся с проблемой.
Нужна помощь с динамической таблицей table.
Как реализовать обработку событий (редактирование,удаление) так как при нажатии LinkButtona она пропадает.Связано как я понял с IsPostBack.События не вызываються.

namespace test2012
{
    public class MyLinkButton : LinkButton
    {
        public Object userData;
    }

    public partial class MagicTable : System.Web.UI.UserControl
    {
        private Table table;
        private int startRow;
        private int maxRows;
        private MyLinkButton[] pageButtons;
        private MyLinkButton[] deleteButtons;
        private MyLinkButton[] editButtons;

        private void BuildCaption()
        {
            TableRow caption = new TableRow();

            TableCell action = new TableCell();
            action.Text = "action";
            action.ForeColor = Color.White;
            action.BackColor = Color.Blue;
            caption.Cells.Add( action );

            TableCell name = new TableCell();
            name.Text = "full name";
            name.ForeColor = Color.White;
            name.BackColor = Color.Blue;
            caption.Cells.Add( name );

            TableCell salary = new TableCell();
            salary.Text = "salary";
            salary.ForeColor = Color.White;
            salary.BackColor = Color.Blue;
            caption.Cells.Add( salary );

            table.Rows.Add( caption );
        }

        private void RefreshTable()
        {
            table.Rows.Clear();
            BuildCaption();

            DataSourceSelectArguments args = new DataSourceSelectArguments();   // <---- don't work
            args.AddSupportedCapabilities( DataSourceCapabilities.Page );
            args.AddSupportedCapabilities( DataSourceCapabilities.RetrieveTotalRowCount );
            args.StartRowIndex = startRow;
            args.MaximumRows = maxRows;

            DataView dv = ( DataView )EmpSqlDataSource.Select( args );

            int index = 0;

            foreach( DataRowView d in dv )
            {
                if( index < startRow )
                {
                    index++;
                    continue;
                }

                if( index == startRow + maxRows )
                    break;

                TableRow row = new TableRow();

                deleteButtons[ index - startRow ].userData = d[ "Emp_id " ];

                TableCell action = new TableCell();
                action.Controls.Add( deleteButtons[ index - startRow ] );
                action.Controls.Add( editButtons[ index - startRow ] );
                row.Cells.Add( action );

                TableCell name = new TableCell();
                name.Text = d[ "First_name" ].ToString() + " " + d[ "Last_name" ].ToString();
                row.Cells.Add( name );

                TableCell salary = new TableCell();
                salary.Text = d[ "Salary" ].ToString();
                row.Cells.Add( salary );

                table.Rows.Add( row );

                index++;
            }

            for( int i = 0; i < pageButtons.Length; i++ )
            {
                pageButtons[ i ].Enabled = i != startRow / maxRows;
                pageButtons[ i ].Visible = i < dv.Count / maxRows + ( dv.Count % maxRows != 0 ? 1 : 0 );
            }
        }
       
        protected void Page_Init(object sender, EventArgs e)
        {
            BuildCaption();
            RefreshTable();
            startRow = 0;
            maxRows = 10;
            if (Page.IsPostBack)
            {
                table = new Table();

                Controls.Add(table);

                pageButtons = new MyLinkButton[10];

                for (int i = 0; i < pageButtons.Length; i++)
                {
                    pageButtons[i] = new MyLinkButton();
                    pageButtons[i].userData = i;
                    pageButtons[i].Text = (i + 1).ToString();
                    pageButtons[i].Click += (s, ee) => { startRow = maxRows * (int)((MyLinkButton)s).userData; RefreshTable(); };

                    Controls.Add(pageButtons[i]);
                }

                deleteButtons = new MyLinkButton[maxRows];
                editButtons = new MyLinkButton[maxRows];

                for (int i = 0; i < maxRows; i++)
                {
                    deleteButtons[i] = new MyLinkButton();
                    deleteButtons[i].Text = "Delete ";
                    deleteButtons[i].Click += CoolDelete;

                    editButtons[i] = new MyLinkButton();
                    editButtons[i].Text = "Edit";
                    editButtons[i].Click += CoolEdit;
                }
            } 
            }
        
        protected void Page_Load(object sender, EventArgs e)
        {
            startRow = 0;
            maxRows = 10;
            if (IsPostBack)
            {
                table = new Table();

                Controls.Add(table);

                pageButtons = new MyLinkButton[10];

                for (int i = 0; i < pageButtons.Length; i++)
                {
                    pageButtons[i] = new MyLinkButton();
                    pageButtons[i].userData = i;
                    pageButtons[i].Text = (i + 1).ToString();
                    pageButtons[i].Click += (s, ee) => { startRow = maxRows * (int)((MyLinkButton)s).userData; RefreshTable(); };

                    Controls.Add(pageButtons[i]);
                }

                deleteButtons = new MyLinkButton[maxRows];
                editButtons = new MyLinkButton[maxRows];

                for (int i = 0; i < maxRows; i++)
                {
                    deleteButtons[i] = new MyLinkButton();
                    deleteButtons[i].Text = "Delete ";
                    deleteButtons[i].Click += CoolDelete;
                    
                    editButtons[i] = new MyLinkButton();
                    editButtons[i].Text = "Edit";
                    editButtons[i].Click += CoolEdit;
                }
            }
        }
        protected void JobDropDownList_DataBound( object sender, EventArgs e )
        {
            RefreshTable();
        }

        protected void JobDropDownList_SelectedIndexChanged( object sender, EventArgs e )
        {
            RefreshTable();
        }

        protected void CoolDelete( object sender, EventArgs e )
        {
            EmpSqlDataSource.DeleteParameters.Clear();
            EmpSqlDataSource.DeleteParameters.Add( "Emp_id_", ( ( MyLinkButton )sender ).userData.ToString() );
            EmpSqlDataSource.Delete(); RefreshTable();
        } 
👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Изучаем ASP.Net Page Life Cycle: i.msdn.microsoft.com/...mg/IC386473.png
msdn.microsoft.com/...y/ms178472.aspx

Для того, чтобы события динамических контролов (Event Handling) отработали, эти контролы должны существовать на странице не позже, чем после Page_Load. Но,т.к. контролы динамические, их придется воссоздать точно с теми же ID, с которыми они были отправлены клиенту в предыдущий раз. Только после того, как события всех контролов отработали, можно удалять старые динамические контролы и создавать новые.

Шаблон выглядит примерно так:

protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack){
//Restore previous Response page layout with the same ID for each dynamic control
}

}

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

protected override void OnLoadComplete(EventArgs e) {
//Удаляем previous page layout, если мы его воссоздавали и создаем новый, который хотим вернуть клиенту в Response с учетом всех обрабоотанных событий
}

Підписатись на коментарі