Привязка к таблице базы данных

В этом примере для демонстрации привязки диаграммы к таблице базы данных используется таблица Products тестовой базы данных Northwind. Процесс начинается с форматирования элемента управления Chart, во многом подобно тому, как это делалось в предыдущем примере.

Для определения соединения с базой данных Northwind с использованием свойства ConnectionString применяются стандартные классы ADO.NET из пространства имен System.Data.SqlClient. После этого определяется запрос, который будет использоваться для генерации данных в диаграмме. Дня этого примера был выбран запрос столбцов ProductName и UnitsInStock таблицы Products с выбором товаров, которые не были сняты с производства, при этом результаты ограничиваются пятью строками. Затем открывается соединение и создается объект SqlDataReader - все это стандартный код ADO.NET:

protected void Page_Load(object sender, EventArgs e)

{

// Форматировать диаграмму

Chart1.BackColor = Color.Gray;

Chart1.BackSecondaryColor = Color.WhiteSmoke;

Chart1.BackGradientStyle = GradientStyle.DiagonalRight;

 

Chart1.BorderlineDashStyle = ChartDashStyle.Solid;

Chart1.BorderlineColor = Color.Gray;

Chart1.BorderSkin.SkinStyle = BorderSkinStyle.Emboss;

 

// Форматировать область диаграммы

Chart1.ChartAreas[0].BackColor = Color.Wheat;

 

// Добавить и форматировать заголовок

Chart1.Titles.Add("ASP.NET Chart");

Chart1.Titles[0].Font = new Font("Utopia", 16);

 

// Создать соединение с базой данных

SqlConnection conn = new SqlConnection(

ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString) ;

 

// Определить команду

SqlCommand command = new SqlCommand("SELECT TOP (5) ProductName, UnitsInStock "

+ "FROM Products WHERE (Discontinued = 'FALSE')", conn);

 

// Открыть команду и создать объект чтения

command.Connection.Open();

SqlDataReader reader = command.ExecuteReader();

 

// Очистить серии диаграммы и привязаться к таблице

Chart1.Series.Clear();

Chart1.DataBindTable(reader);

Chart1.Series["UnitsInStock"].ChartType = SeriesChartType.StackedBar;

 

// Закрыть объект чтения и соединение

reader.Close();

conn.Close();

}

В этом коде, после того как диаграмма сформатирована, а соединение с данными создано, данные привязываются к диаграмме. Процесс начинается с очистки коллекции Chart.Series. Это необходимо потому, что при привязке таблицы элемент управления Chart автоматически создает новый экземпляр Series для каждого числового столбца, найденного в данных. В результате будет создан экземпляр Series по имени UnitsInStock. Однако созданный по умолчанию экземпляр Series (получивший имя Series1) не удаляется, а это может привести к проблемам при изменении значения свойства Series.ChartType на такое, которое не сможет быть графически представлено в той же области ChartArea, что и столбчатая диаграмма (Column), являющаяся стандартным типом для серий по умолчанию. Рекомендуется перед привязкой к данным созданный по умолчанию класс Series удалить, чтобы в конечном итоге остался только экземпляр Series, ассоциированный с данными.

Затем нужно выполнить привязку с использованием метода DataBindTable(), который принимает ранее созданный SqlDataReader в качестве аргумента. Как уже упоминалось ранее, привязка к таблице автоматически создает по одной серии данных для каждого числового столбца данных. В данном случае запрашиваются столбцы ProductName и UnitsInStock. Элемент управления Chart проигнорирует текстовый столбец ProductName и создаст новый экземпляр Series для столбца UnitsInStock. Форматирование объекта Series невозможно до тех пор, пока он не будет создан, поэтому свойство ChartType устанавливается после того, как таблица привязана к элементу управления. И, наконец, объекты SqlDataReader и SqlCommand закрываются.

Диаграмма, созданная этим кодом, показана на рисунке ниже:

Проблема с этой диаграммой состоит в том, что столбец ProductName был проигнорирован. Во время процесса привязки элемент управления Chart работал исходя из того, что все SQL-данные должны были интерпретироваться как значения по оси Y, и отбрасывал все, что не могло использоваться подобным образом.

Если один из столбцов должен служить в качестве значений по оси X, об этом нужно явно сообщить элементу управления Chart, выполняя привязку данных с помощью метода Points.DataBindXY() класса Series. Чтобы адаптировать предыдущий пример, закомментируйте три строки начиная с Chart1.Series.Clear() и добавьте две новых строки в файл отделенного кода:

// Очистить серии диаграммы и привязаться к таблице

/* Chart1.Series.Clear();

Chart1.DataBindTable(reader);

Chart1.Series["UnitsInStock"].ChartType = SeriesChartType.StackedBar; */

// Привязать значения X и Y к созданным по умолчанию сериям и форматировать диаграмму

Chart1.Series.Add(new Series("Default")

{

ChartType = SeriesChartType.StackedBar

});

Chart1.Series[0].Points.DataBindXY(reader, "ProductName", reader, "UnitsInStock");

Метод DataBindXY() позволяет предоставлять источник данных и имена столбцов, которые должны применяться для осей X и Y. В рассматриваемом примере источником данных для обеих осей является SqlDataReader, а именами столбцов - ProductName и UnitsInStock. Обратите внимание, что в этот раз коллекция Series не очищается. Метод DataBindXY() применяется к уже существующей коллекции Series (а не создает новую), и в примере была использована та, которая создается по умолчанию. Открыв измененную страницу, можно увидеть результат, показанный на рисунке ниже: