views:

566

answers:

2

At btnSave - button event-handler, in the following two lines, SelectedValue is always returning null.

not.TargetSessionCode = this.sessionsDropDownList1.SelectedValue;
not.CourseCode = this.coursesDropDownList1.SelectedValue;

Can anyone say why?

This is my aspx code:

<%@ Page Language="C#" MasterPageFile="~/MasterPage.Master" AutoEventWireup="true" CodeBehind="TeacherComposeNotice.aspx.cs" Inherits="Ice_Web_Portal_v_3_0_WebApplication.Teacher.TeacherComposeNotice" Title="Untitled Page" %>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
    <table style="width: 270px">
        <tr>
            <td style="text-align: right">
                Session:</td>
            <td colspan="2">
                <asp:DropDownList ID="sessionsDropDownList1" runat="server" Width="178px">
                </asp:DropDownList></td>
            <td colspan="1" style="width: 6px">
                <asp:Label ID="userNameLabel" runat="server" Text="usernameLabel" Width="167px"></asp:Label></td>
        </tr>
        <tr>
            <td style="text-align: right">
                Courses:</td>
            <td colspan="2">
                <asp:DropDownList ID="coursesDropDownList1" runat="server" Width="178px">
                </asp:DropDownList></td>
                <td colspan="1"><asp:Label id="labCourses" runat="server" Width="167px" Text="labCourses"></asp:Label></td>
        </tr>
        <tr>
            <td style="text-align: right">
                Subject:</td>
            <td colspan="3">
                <asp:TextBox ID="mailSubjectTextBox" runat="server" Width="343px"></asp:TextBox></td>
        </tr>
        <tr>
            <td style="text-align: right" valign="top">
                Content:</td>
            <td colspan="3">
                <asp:TextBox ID="mailContentTextBox" runat="server" Height="181px" Width="343px" Font-Names="Verdana"></asp:TextBox></td>
        </tr>
        <tr>
            <td style="text-align: right" valign="top">
                Expiry Date :</td>
            <td colspan="3">
            </td>
        </tr>
        <tr>
            <td style="text-align: right" valign="top">
            </td>
            <td colspan="3" style="text-align: center">
                &nbsp;</td>
        </tr>
        <tr>
            <td style="text-align: right" valign="top">
            </td>
            <td colspan="3" style="text-align: left">
                <asp:Label ID="errorMessageLabel" runat="server" ForeColor="#C00000" Text="***" Width="314px"></asp:Label></td>
        </tr>
        <tr>
            <td style="text-align: right" valign="top">
            </td>
            <td colspan="3" style="text-align: left">
                <asp:Button ID="btnBack" runat="server" OnClick="btnBack_Click" Text="Back" />
                <asp:Button ID="btnSave" runat="server" OnClick="btnSave_Click" Text="Save" /></td>
        </tr>
    </table>
</asp:Content>

This is my code-behind:

public partial class TeacherComposeNotice : System.Web.UI.Page
        {
            string username = string.Empty;

            protected void Page_Load(object sender, EventArgs e)
            {
                username = (string)Request.QueryString["username"];

                if (!IsPostBack)
                {
                    LoadAllSessionsToDDL();
                    LoadAllCoursesToDDL();
                }

            }

            private void LoadAllSessionsToDDL()
            {
                this.sessionsDropDownList1.Items.Clear();

                List<Ice_Web_Portal.BO.Session_> items = Ice_Web_Portal.BO.Session_.GetAllSessions();

                this.sessionsDropDownList1.DataSource = items;
                this.sessionsDropDownList1.DataTextField = "SessionName";
                this.sessionsDropDownList1.DataValueField = "SessionCode";
                this.sessionsDropDownList1.DataBind();

                this.sessionsDropDownList1.SelectedIndex = 0;
            }

            private void LoadAllCoursesToDDL()
            {
                this.coursesDropDownList1.Items.Clear();

                List<Course> items = Course.GetCourses();

                this.coursesDropDownList1.DataSource = items;
                this.coursesDropDownList1.DataTextField = "CourseName";
                this.coursesDropDownList1.DataValueField = "CourseCode";
                this.coursesDropDownList1.DataBind();
            }

            protected void btnBack_Click(object sender, EventArgs e)
            {
                Server.Transfer("~/Teacher/TeacherControlPanel.aspx?username=" + username);
            }

            protected void btnSave_Click(object sender, EventArgs e)
            {
                Ice_Web_Portal.BO.Teacher teacher = Ice_Web_Portal.BO.Teacher.GetTeacherByUsername(username);

                if (teacher != null)
                {
                    Notice not = new Notice();
                    not.HangingDate = DateTime.Now;
                    not.TeacherCode = teacher.TeacherCode;
                    not.TargetSessionCode = this.sessionsDropDownList1.SelectedValue;
                    not.CourseCode = this.coursesDropDownList1.SelectedValue;
                    not.NoticeSubject = this.mailSubjectTextBox.Text;
                    not.NoticeContent = this.mailContentTextBox.Text;
                    not.ExpiryDate = DateTime.Now.AddMonths(1);
                    not.IsExpired = false;

                    bool success = Notice.Save(not);

                    if (success)
                    {
                        errorMessageLabel.Text = "Saved";
                    }
                    else
                    {
                        errorMessageLabel.Text = "Save failed";
                    }
                }
                else
                {
                    //labErrorMessage.Text = "No teacher found";
                }
            }
        }
+1  A: 

Very strange. Your code seems to be perfectly fine. I tried to reconstruct your page with the following code behind:

public partial class DropdownTests : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            LoadAllCoursesToDDL();
        }
    }

    private List<Course> GetDummyCourses()
    {
        return new List<Course>{
            new Course{ CourseCode = "A12", CourseName = "Introduction to Programming"},
            new Course{ CourseCode = "B112", CourseName = "Theory of Computing"}
        };
    }

    private void LoadAllCoursesToDDL()
    {
        this.coursesDropDownList1.Items.Clear();

        List<Course> items = GetDummyCourses();

        this.coursesDropDownList1.DataSource = items;
        this.coursesDropDownList1.DataTextField = "CourseName";
        this.coursesDropDownList1.DataValueField = "CourseCode";
        this.coursesDropDownList1.DataBind();
    }

    protected void btnBack_Click(object sender, EventArgs e)
    {
        //Server.Transfer("~/Teacher/TeacherControlPanel.aspx?username=" + username);
    }

    protected void btnSave_Click(object sender, EventArgs e)
    {
        string code = coursesDropDownList1.SelectedItem.Value;
        string code2 = coursesDropDownList1.SelectedValue;
    }
}

public class Course
{
    public string CourseCode { get; set; }
    public string CourseName { get; set; }
}

It just worked perfectly fine. In case, try to use coursesDropdownList1.SelectedItem.Value instead of "SelectedValue" directly. Shouldn't matter, but just to give it a try.

As a try, I would also create a new page, copy the aspx code there and create the codebehind for it. In my opinion there must be something more which causes it to fail. Do you create and add some fields to the UI dynamically at run-time? Some custom server controls etc?? Your problem could be that you loose your ViewState.

Juri
No. I am not adding anything dynamically. Anything else to check for? courseDropDownLoat.SelectedItem is null.
JMSA
did you try to "reprogram" this page. Basically placing the ASPX code + the codebehind in a new file. Often this helps you out. Btw, did my simplified example work for you?
Juri
Another thing comes to my mind. Check whether on your masterpage or somewhere you specified "EnableViewState = false"
Juri
@Juri, Bravo!!!!!!!!!!!!!!
JMSA
My MasterPage's content place holder had that....:-)
JMSA
+1  A: 

me had the same problem, but enableViewState = true is the only solution makes it to work. really strange

jon doe