Англоязычные блоги пестрят сообщениями о выходе первого превью ASP.NET MVC 2. Подробности как всегда можно посмотреть в блоге Скотта Гатри (Scott Guthrie)
Я сейчас не буду переводить подробности, просто скажу, что много полезного из Dynamic Data перекочевало собственно в ASP.NET MVC Framework. Вместо этого я хотел бы задать вопрос читателям – а что бы вы хотели увидеть в следующем релизе ASP.NET MVC? Со своей стороны обещаю, что самые интересные предложения передам разработчикам MVC фреймворка.
Наткнулся на статью http://habrahabr.ru/blogs/net/65697/ в которой приводили пример вопроса на собеседовании:
public class A
{
public void OnDoWork()
{
if (DoWork != null)
DoWork(this, EventArgs.Empty);
}
public event EventHandler DoWork;
}
1. Что будет с программой, если класс A видоизменить так: убрать ключевое слово event?
2. Что будет с программой, если вообще во всем коде убрать ключевые слова event?
…
Поэтому ответы на вопросы будут такие:
1. Ничего не изменится
2. Ничего не изменится, если только в программе нет объявленных в интерфейсах событий.
На мой взгляд, сегодня подобное характерно на собеседованиях. Задающие вопросы люди САМИ не знают правильного ответа. Более того, и пример приводят абсолютно бессмысленный, с публичным обработчиком этого самого события. И даже потом пишут статьи на популярном ресурсе, декларируя такие замечательные ответы.
Пусть попробуют на досуге:
var test = new A();
test.DoWork = null;
UPD: В комментариях нашлись-таки люди, которые привели правильный ответ. Надеюсь до этого комментария хоть кто-нибудь дочитает :)
В очередной раз столкнувшись с необходимостью создать отчет в excel, я вспомнил что Microsoft выпустил для нас SDK, который по идее отменяет необходимость в автоматизации офиса. Я обрадовался, скачал SDK и стал смотреть примеры кода. Первое, что меня удивило – примеров крайне мало. Ладно, подумал я. В состав пакета входит замечательная утилита под названием Document Reflector – она загружает документ и выдает код на C#! Я создал пустой .xlsx файл, открыл его в рефлекторе, взял код, запустил, сохранил сгенерированный файл и…
Ошибка, эксель предлагает восстанавливать данные. Ладно, ведь это CTP. Откроем документ и сделаем в нем новый лист. И вот тут оказалось, что это не такая уж и простая задача. Вообще, если честно, DOM мне не понравился. Понятно что он и должен быть сложным, но должны же быть простые пути решения типовых задач! В общем, если кто-то тоже мучается как и я, то вот что у меня получилось для создания нового листа в книге excel (код модифицирован для демонстрационных целей :) )
1 // указываете путь к своему документу excel
2 using (var doc = SpreadsheetDocument.Open("test.xlsx", true))
3 {
4 var newWorksheetPart = doc.AddNewWorksheet("Новый лист");
5 var sheetData = newWorksheetPart.Worksheet.GetFirstChild<SheetData>();
6
7 var row = new Row { RowIndex = 1 };
8 row.AddTextCell("A", row.RowIndex, "Привет");
9 row.AddTextCell("B", row.RowIndex, "Мир");
10
11 sheetData.AppendChild(row);
12 newWorksheetPart.Worksheet.Save();
13 doc.WorkbookPart.Workbook.Save();
14 }
А это – обертка
8 public static class SpreadsheetDocumentExtensions
9 {
10 public static WorksheetPart AddNewWorksheet(
11 this SpreadsheetDocument doc, string name)
12 {
13 if(null == doc) return null;
14
15 var newWp = doc.WorkbookPart.AddNewPart<WorksheetPart>();
16 var newWs = new Worksheet(new SheetData());
17 newWs.Save(newWp);
18
19 var newWpId = doc.WorkbookPart.GetIdOfPart(newWp);
20 var sheets = doc.WorkbookPart.Workbook.GetFirstChild<Sheets>();
21
22 uint sheetId = 1;
23 if (sheets.Elements<Sheet>().Count() > 0)
24 {
25 sheetId = sheets.Elements<Sheet>().Select(s => s.SheetId.Value).Max() + 1;
26 }
27
28 var sheet = new Sheet
29 {
30 Id = newWpId,
31 SheetId = sheetId, Name = name
32 };
33
34 sheets.Append(sheet);
35 return newWp;
36 }
37
38
39 public static Cell AddTextCell(
40 this Row row, string column, uint index, string text)
41 {
42 if(null == row) return null;
43
44 var cell = new Cell
45 {
46 DataType = CellValues.InlineString,
47 CellReference = column + index
48 };
49
50 cell.AppendChild(new InlineString(new Text { Text = text }));
51 row.AppendChild(cell);
52 return cell;
53 }
54 }