开发者

C# DropDownList and Session[""]

Everyone.

I have a little issue with selecting value from the dropdown list. When user enters his/her credentials and selects the datasource name, they are all stored in session. When the user comes back to the login page later, I want him/her to see last selected datasource name. It works for the first time, but when I try to change the datasource name, it doesnt change but the value chosen before appears. Can you help me with this issue? Thanks!

default.aspx

public partial class _Default : System.Web.UI.Page 
{
    private dbConnection connection = new dbConnection();
    private string[,] errorMessage = 
        { {"Expired", "Unsuccessful", "Incorrect"}, 
        {"Your Logon Session Has Expired", "Invalid Username or Password", 
            "Selected Data Source is not supported within this application"} };

    protected void Page_Load(object sender, EventArgs e)
    {

        ddlDatabase.DataTextField = "Value";
        ddlDatabase.DataValueField = "Key"; 
        ddlDatabase.DataSource = dbList.GetDbList();
        ddlDatabase.DataBind();    

        Response.Buffer = true;

        if (Session["Error"] != null)
                ErrorMessage();

        if (Session["Datasource"] != null)
            ddlDatabase.SelectedValue = Session["Datasource"].ToString();
    }

    protected void btnLogin_Click(object sender, EventArgs e)
    {
        string dataSource = ddlDatabase.SelectedValue;
        string userID = txtUserID.Text;
        string password = txtPassword.Text;

        connection = new dbConnection(dataSource, userID, password);

        if (connection.IsValid())
        {
            try
            {
                connection.GetConnection().Open();
                Session["Username"] = userID;
                Session["Password"] = password;
                Session["Datasource"] = ddlDatabase.SelectedValue;
                Response.Clear();
                Response.Redirect("main.aspx", false);
            }
            catch (Exception ex)
            {
                lblSessionInfo.Text = ex.Message;
                Session["Username"] = null;
                Session["Password"] = null;
                Session["Error"] = "Unsuccessful";
                Response.Clear();
                Response.Redirect("default.aspx");
            }
        }
        else
        {
            Session["Username"] = null;
            Session["Password"] = null;
            Session["Datasource"] = null;
            Session["Error"] = "Incorrect";
            Response.Clear();
            Response.Redirect(Request.Url.ToString(), true);
        }
    }

    protected void ErrorMessage()
    {
        int length = errorMessage.Length / 2;

        for (int i = 0; i < length; i++)
            if (Session["Error"].ToString() == errorMessage[0, i])
                lblSessionInfo.Text = errorMessage[1, i];
    }
}

main.aspx (Logout)

public partial class main : System.Web.UI.Page
{
    dbConnection connection = new dbConnection();

    protected void Page_Load(object sender, EventArgs e)
    {
        Response.Buffer = true;
        if (Session["Username"] == null)
        {
            Session["Error"] = "Expired";
            Response.Clear();
            Response.Redirect("default.aspx");
        }
        else
        {
            Session["Error"] = null;
        }

        Label1.Text = Session["Datasource"].ToString();
    }
    protected void btnLogout_Click(object sender, Even开发者_JS百科tArgs e)
    {
        connection.GetConnection().Close();
        Session["Username"] = null;
        Session["Password"] = null;
        Response.Clear();
        Response.Redirect(Request.Url.ToString(), true); 
    }
}

dbList.cs

public class dbList
{
    public static Dictionary<int, string> GetDbList()
    {
        //List<string> dataSources = new List<string>();
        var dataSources = new Dictionary<int, string>(); 

        RegistryKey reg = (Registry.LocalMachine).OpenSubKey("Software");
        reg = reg.OpenSubKey("ODBC");
        reg = reg.OpenSubKey("ODBC.INI");
        reg = reg.OpenSubKey("ODBC Data Sources");

        if (reg != null)
        {
            string[] items = reg.GetValueNames();
            Array.Sort(items);
            int i = 0;
            foreach (string item in items)
            {
                dataSources.Add(i, item);
                i++;
            }
        }

        reg.Close();

        return dataSources;
    }
}

dbConnection.cs

public class dbConnection
{
    private string[] dataSources = { "name1", "name2", "name3" };

    public dbConnection() {}

    public dbConnection(string dataSource, string userID, string password)
    {
        DataSource = dataSource;
        UserID = userID;
        Password = password;
    }

    public string DataSource { get; set; }
    private string UserID { get; set; }
    private string Password { get; set; }

    public OracleConnection GetConnection()
    {
        OracleConnection connection = null;

        string connectionString = 
            @"Data Source="+ DataSource + 
            ";User ID=" + UserID + 
            ";Password=" + Password + 
            ";Unicode=True";

        try
        {
            connection = new OracleConnection(connectionString);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Error");
        }

        return connection;
    }

    public bool IsValid()
    {
        int trueCount = 0;

        foreach (string dataSource in dataSources)
            if (DataSource == dataSource) trueCount++;

        if (trueCount > 0) return true;
        else  return false;
    }

}


UPDATE: 6/13/2011

Can you try creating a Dictionary instead of a List<string> in your get GetConnection() method?

var dictionary = new Dictionary<int, string>();
dictionary.Add(1, "Connection1");
dictionary.Add(2, "Connection2");
dictionary.Add(3, "Connection3");
dictionary.Add(4, "Connection4");

// Binding the dictionary to the DropDownList:
dropDown.DataTextField = "Value";
dropDown.DataValueField = "Key";
dropDown.DataSource = dictionary;  //Dictionary<int, string>
dropDown.DataBind();

You need to Bind Your 'ddlDatabase' First & then set the SelectedValue. Otherwise, only 1 item is created (with the SelectedValue) in yourDropdown list, and you dont have any items to choose from Except the one item.

//Code to databind ddlDatabase
BindDatabaseDropdown();
if (Session["Datasource"] != null)
        ddlDatabase.SelectedValue = Session["Datasource"].ToString();


Isn't it simply because of that part of the code ?

protected void Page_Load(object sender, EventArgs e)
{
    ddlDatabase.DataSource = dbList.GetDbList();
    ddlDatabase.DataBind();

    Response.Buffer = true;

    if (Session["Error"] != null)
            ErrorMessage();

    if (Session["Datasource"] != null)
        ddlDatabase.SelectedValue = Session["Datasource"].ToString();
}

The ddlDatabase.SelectedValue = Session["Datasource"].ToString(); should be called only on first page load (if(!isPostBack)). The way it is now, the selected value in your drop down list would always (ALWAYS) be taken from the session, before the Click_handler is called. Therefore, in that part :

Session["Password"] = password;
Session["Datasource"] = ddlDatabase.SelectedValue;
Response.Clear();

the ddlDatabase.SelectedValue is no longer the value the user selected...


Found solution. It is much simpler than I thought. Instead of using ddlDatabase.DataSource, I used ddlDatabase.Items.Add(); and added Session["Datasource"] = null;. Here are the codes:

default.aspx

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.OracleClient;
using System.Windows.Forms;

public partial class _Default : System.Web.UI.Page 
{
    private db connection = new db();
    private string[,] errorMessage = 
        { {"Expired", "Unsuccessful", "Incorrect"}, 
        {"Your Logon Session Has Expired", "Invalid Username or Password", 
            "Selected Data Source is not supported within this application"} };

    protected void Page_Load(object sender, EventArgs e)
    {
        Response.Buffer = true;

        foreach (string name in connection.GetDbList())
            ddlDatabase.Items.Add(name);

        if (Session["Error"] != null)
                ErrorMessage();

        if (Session["Datasource"] != null)
        {
            ddlDatabase.SelectedValue = Session["Datasource"].ToString();
            Session["Datasource"] = null;
        }

    }

    protected void btnLogin_Click(object sender, EventArgs e)
    {
        string dataSource = ddlDatabase.SelectedValue.ToString();
        string userID = txtUserID.Text;
        string password = txtPassword.Text;

        connection = new db(dataSource, userID, password);

        if (connection.IsValid())
        {
            try
            {
                connection.GetConnection().Open();
                Session["Username"] = userID;
                Session["Password"] = password;
                Session["Datasource"] = ddlDatabase.SelectedValue;
                Response.Clear();
                Response.Redirect("main.aspx", false);
            }
            catch (Exception ex)
            {
                lblSessionInfo.Text = ex.Message;
                Session["Username"] = null;
                Session["Password"] = null;
                Session["Datasource"] = ddlDatabase.SelectedValue;
                Session["Error"] = "Unsuccessful";
                Response.Clear();
                Response.Redirect("default.aspx");
            }
        }
        else
        {
            Session["Username"] = null;
            Session["Password"] = null;
            Session["Datasource"] = null;
            Session["Error"] = "Incorrect";
            Response.Clear();
            Response.Redirect(Request.Url.ToString(), true);
        }
    }

    protected void ErrorMessage()
    {
        int length = errorMessage.Length / 2;

        for (int i = 0; i < length; i++)
            if (Session["Error"].ToString() == errorMessage[0, i])
                lblSessionInfo.Text = errorMessage[1, i];
    }
}

db.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.OracleClient;
using System.Windows.Forms;
using Microsoft.Win32;

public class db
{
    private string[] dataSources = { "ValidNames" };

    public db() {}

    public db(string dataSource, string userID, string password)
    {
        DataSource = dataSource;
        UserID = userID;
        Password = password;
    }

    private string DataSource { get; set; }
    private string UserID { get; set; }
    private string Password { get; set; }

    public OracleConnection GetConnection()
    {
        OracleConnection connection = null;

        string connectionString = 
            @"Data Source="+ DataSource + 
            ";User ID=" + UserID + 
            ";Password=" + Password + 
            ";Unicode=True";

        try
        {
            connection = new OracleConnection(connectionString);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Error");
        }

        return connection;
    }

    public List<string> GetDbList()
    {
        List<string> dataSources = new List<string>();

        RegistryKey reg = (Registry.LocalMachine).OpenSubKey("Software");
        reg = reg.OpenSubKey("ODBC");
        reg = reg.OpenSubKey("ODBC.INI");
        reg = reg.OpenSubKey("ODBC Data Sources");

        if (reg != null)
        {
            string[] items = reg.GetValueNames();
            Array.Sort(items);
            foreach (string item in items)
                dataSources.Add(item);
        }

        reg.Close();

        return dataSources;
    }

    public bool IsValid()
    {
        int trueCount = 0;

        foreach (string dataSource in dataSources)
            if (DataSource == dataSource) trueCount++;

        if (trueCount > 0) return true;
        else  return false;
    }
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜