views:

67

answers:

1

The problem is: On postback, the table does not have the rows that were dynamically created, the rowcount is 0.

  • Click on the button, it should detect the checked checkboxes within the table dynamically generated.
  • The table is made by code when the "day" is selected using the drop down list and "the starting date" is selected using the calender.

I know there's a lot of code, but it's the least I thought I had to post, so answerers can debug. Please note I have tried hard but cannot get the solution to this.

Here’s the code:

public partial class DaySelection : System.Web.UI.Page
{
    Table table1 = new Table();
    Button button1 = new Button();
    string the_id_checkbox;
    string the_id_label;
    //The need of the table ENDS
    DropDownList selectdays = new DropDownList();
    Label theselecteddate = new Label();
    Button extract_the_selected = new Button();
    Literal selected_values=new Literal();
    int number_of_row = -1;
    protected void Page_Load(object sender, EventArgs e)
    {
        CheckBox check_or_not = new CheckBox();
        try
        {
            selected_values.Text = "";
            form1.Controls.Remove(selected_values);
            form1.Page.Response.Write("inside try");
            for (int i = 0; i < table1.Rows.Count; i++)
            {
                Response.Write("inside for");
                the_id_checkbox = "checkmate" + i;
                the_id_label = "The_text" + i;
                check_or_not = (CheckBox)table1.Rows[i].FindControl(the_id_checkbox);
                if (check_or_not.Checked == true)
                {
                    form1.Page.Response.Write("inside if");
                    selected_values.Text = selected_values.Text + "<br /> " + check_or_not.Checked.ToString();
                    selected_values.Text = selected_values.Text + "  and the day is:  " + ((Label)table1.Rows[i].FindControl(the_id_label)).Text;
                }
                else
                {
                    Response.Write(" selection no detect");
                }
            }
            form1.Controls.AddAt(1, selected_values);
            Response.Write(selected_values.Text);
        }
        catch (NullReferenceException nn)
        {
            form1.Page.Response.Write("inside catch" + nn.Message.ToString() + nn.StackTrace);
        }
        extract_the_selected.Text = "Extract it";
        form1.Controls.AddAt(2,extract_the_selected);
        selectdays.AutoPostBack = true;
        ArrayList thedays = new ArrayList();
        thedays.Add("Monday" + DateTime.Now);
        thedays.Add("Tuesday");
        thedays.Add("Wednesday");
        thedays.Add("Thursday");
        thedays.Add("Friday");
        thedays.Add("Saturday");
        thedays.Add("Sunday");
        selectdays.DataSource = thedays;
        selectdays.DataBind();
        form1.Controls.AddAt(3,selectdays);
        Calendar1.SelectionChanged += new EventHandler(Calendar1_SelectionChanged);
    }

    void Calendar1_SelectionChanged(object sender, EventArgs e)
    {
        DateTime startdate;
        string month;
        month = Calendar1.SelectMonthText;
        startdate = Calendar1.SelectedDate;
        days_date(startdate);
    }

    void selectdays_SelectedIndexChanged(object sender, EventArgs e)
    {
        display_dates_of_day(DateTime.Parse("9-1-2010"), DateTime.Parse("9-30-2010"), selectdays.SelectedItem.Text);
    }

    public void days_date(DateTime startdate)
    {
        int noofdays;
        DateTime enddate = new DateTime();
        noofdays = DateTime.DaysInMonth(startdate.Year, startdate.Month) - 1;
        enddate = startdate.AddDays(noofdays);
        Response.Write("<br /> end date is  " + enddate);
        Response.Write("<br /> start date is " + startdate);
        display_dates_of_day( startdate, enddate, selectdays.SelectedItem.Text);
    }

    void display_dates_of_day(DateTime startDate, DateTime endDate, string selectedday)
    {
        int Count = 0;
        for (DateTime dt = startDate; dt <= endDate; dt = dt.AddDays(1.0))
        {
            if (dt.DayOfWeek.ToString() == selectedday)
            {
                table1.ID = "table1";
                number_of_row = number_of_row + 1;
                string date = dt.Date.ToString("dd-MMMM-yyyy");
                for (int adding_rows = 0; adding_rows < 1; adding_rows++)
                {
                    TableRow table_row1 = new TableRow();
                    TableCell table_cell1 = new TableCell();
                    TableCell table_cell2 = new TableCell();
                    Label The_label = new Label();
                    CheckBox checkmate = new CheckBox();
                    The_label.Text = date + " (<---date)" + number_of_row;
                    the_id_checkbox = "checkmate" + number_of_row;
                    checkmate.ID = the_id_checkbox;
                    the_id_label = "The_text" + number_of_row;
                    The_label.ID = the_id_label;
                    table_cell2.Controls.Add(checkmate);
                    table_cell1.Controls.Add(The_label);
                    table_row1.Controls.AddAt(0, table_cell1);
                    table_row1.Controls.AddAt(1, table_cell2);
                    table1.Rows.Add(table_row1);
                }
                button1.Text = "click me to export the value";
                form1.Controls.Add(table1);
                form1.Controls.AddAt(1, selected_values);
                Count++;
            }
        }
        Response.Write("<br /> The count of days by traversing:  " + Count);
    }
}
+3  A: 

The reason you're seeing this seemingly "strange" behaviour is that you're dynamically constructing the contents of Table1 and adding it to the pages .Controls collection only in the display_dates_of_day method, which is called by:

  • selectdays_SelectedIndexChanged
  • Calendar1_SelectionChanged (indirectly)

This means that when your page is re-contructed on post-back, the controls don't exist. If you "View Source" in your browser, you'll find that after clicking the button to trigger a post-back you can't find the string "Table1" in the markup, but if you do it after clicking on a date in the calendar, you can. That's because in the "clicking the button" scenario, the control is never populated and added to the page

I'd make a few suggestions to get your head round this and solve the problem:

  1. Start with a much simplified version of this to help you understand the asp.net page lifecycle and how it impacts on what you're doing.
  2. Try to ensure your code adds as few controls as possible to the page dynamically as this makes things a lot simpler. i.e. Make Table1 a control that's declared in the .aspx page.
Rob
point 2, if i drag the table control onto page on design time, will it solve the problem? (i will still be adding rows by code)
@user287745, try it and see =) (That said, it'll not solve the problem because `table1` will be on the page, but won't contain any rows. You need to ensure that the relevant rows are added irrespective of whether the page is called via a button click postback, or one from clicking on a date in the calendar)
Rob
k will check that
please check this link, have added a proper question help there if can thanks http://stackoverflow.com/questions/3646356/dynamic-creation-adding-row-and-cols-in-table-works-but-on-button-click-things