Мне недавно было поручено обновить старый проект, использующий элемент управления asp: listbox (с которым я не очень хорошо справляюсь).
Настройка состоит в том, что ListBox помещается на страницу aspx.page и заполняется данными через атрибут DataSource.
Таблица базы данных столбцов, заполняющая ListBox, представляет собой activity_points (тип данных с плавающей запятой) и activity_title (тип данных строка / varchar).
ListBox заполняется, и все выглядит хорошо, пока я не проверю значение элементов списка.
ListBox выглядит следующим образом
<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" />
Метод по умолчанию (который я унаследовал) выглядит следующим образом
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);
}
Сгенерированные элементы списка выглядят так
<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>
Как ясно видно, он смешивает точки и запятые и добавляет ноль после каждого вхождения, если повторяется одно и то же значение. Если я отображаю тот же набор результатов в GridView, все выглядит отлично!
Просто чтобы убедиться, что данные, возвращаемые из базы данных, верны, я создал новый метод, который преобразует столбец activity_points
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;
}
У меня заканчиваются опции, есть ли что-то волшебное в ListBoxes, которое я пропустил?
Любой совет высоко ценится!
Спасибо