I recently was assigned to update an old project who use the asp:listbox control (which I’m not very good at handling).
The set up is that the ListBox is placed on a aspx.page and fills itself with data through the DataSource attribute.
The columns database table populating the ListBox is activity_points (datatype float) and activity_title (datatype string / varchar).
The ListBox gets filled out and everything looks fine until i check whats in the value of the list items.
The ListBox looks as follows
<asp:ListBox runat="server" DataSource="<%# GetActivitys(1) %>" DataTextField="activity_title"
DataValueField="activity_points" EnableViewState="true" onchange="DataChanged();SumUpRow(this,true);"
Width="200" CssClass="ddl-activity1" ID="activities_1_1" Rows="1" />
The default method (which I inherited) looks like this
public SqlDataReader GetActivitys(int type)
{
SqlConnection conn = new SqlConnection(umbraco.GlobalSettings.DbDSN);
SqlCommand cmd = new SqlCommand("SELECT * FROM " + DATABASE_TABLE_ACTIVITIES + " WHERE activity_type=" + type.ToString() + " ORDER BY activity_type, activity_sortorder, activity_title", conn);
cmd.Connection.Open();
return cmd.ExecuteReader(CommandBehavior.CloseConnection);
}
The generated list items look like this
<option value="6">testing</option>
<option value="9">testing</option>
<option value="6,5">testing</option>
<option value="5">testing</option>
<option value="7">testing</option>
<option value="4,5">testing</option>
<option value="6.0">testing</option>
<option value="4">testing</option>
<option value="3.0">testing</option>
<option value="6.00">testing</option>
<option value="3,5">testing</option>
<option value="6.000">testing</option>
As clearly seen it mixes points and commas, and it adds a zero after each occurrence if the same value is repeated. If I render the same result set to a GridView everything looks fine!
Just to ensure that the data returned from the database is correct I’ve created a new method that converts the activity_points column
public DataTable GetActivitys(int type)
{
string query = "SELECT activity_points, activity_title, activity_id FROM " + DATABASE_TABLE_ACTIVITIES + " WHERE activity_type=" + type.ToString() + " ORDER BY activity_type, activity_sortorder, activity_title";
SqlConnection conn = new SqlConnection(umbraco.GlobalSettings.DbDSN);
SqlDataAdapter da = new SqlDataAdapter(query, conn);
DataTable dt = new DataTable();
da.Fill(dt);
/**/
DataTable dtActivity = new DataTable();
DataColumn ActivityCol;
ActivityCol = new DataColumn();
ActivityCol.DataType = Type.GetType("System.String");
ActivityCol.ColumnName = "activity_points";
dtActivity.Columns.Add(ActivityCol);
ActivityCol = new DataColumn();
ActivityCol.DataType = Type.GetType("System.String");
ActivityCol.ColumnName = "activity_title";
dtActivity.Columns.Add(ActivityCol);
ActivityCol = new DataColumn();
ActivityCol.DataType = Type.GetType("System.Int32");
ActivityCol.ColumnName = "activity_id";
ActivityCol.Unique = true;
dtActivity.Columns.Add(ActivityCol);
foreach (DataRow item in dt.Rows)
{
DataRow activityRow = dtActivity.NewRow();
activityRow["activity_points"] = Convert.ToDouble(item["activity_points"]);
activityRow["activity_title"] = item["activity_title"];
activityRow["activity_id"] = item["activity_id"];
dtActivity.Rows.Add(activityRow);
}
return dtActivity;
}
Im running out of options, is there something magic about ListBoxes that I missed?
Any advice is highly appreciated!
Thanks
Appears as if the listbox values always gets an incremental value of an integer