Другим случаем, когда NullReferenceExceptions
может случиться, является (неправильное) использование оператора as
:
class Book {
public string Name { get; set; }
}
class Car { }
Car mycar = new Car();
Book mybook = mycar as Book; // Incompatible conversion --> mybook = null
Console.WriteLine(mybook.Name); // NullReferenceException
Здесь Book
и Car
являются несовместимыми типами; a Car
не может быть преобразован / передан в Book
. Когда этот сбой завершается неудачно, as
возвращает null
. Используя mybook
после этого, вы вызываете NullReferenceException
.
В общем случае вы должны использовать cast или as
, как показано ниже:
Если вы ожидаете преобразования типа в всегда преуспевает (т. е. вы знаете, какой объект должен быть впереди времени), тогда вы должны использовать cast:
ComicBook cb = (ComicBook)specificBook;
Если вы не уверены в типе, но хотите попробовать , чтобы использовать его как определенный тип, затем используйте as
:
ComicBook cb = specificBook as ComicBook;
if (cb != null) {
// ...
}
Вы должны попросить пользователя распечатать текущую страницу, нет способа обойти этот шаг ( возможно в activeX для IE). Тем не менее, существует два разных способа заставить пользователя печатать изображения, которые вы улыбаетесь при загрузке страницы.
Вот как это сделать в JavaScript.
window.onload = function() {
var img = window.open("me-smiling.png");
img.print();
}
И вот как это сделать в css / javascript / html (при условии, что ваша фотография имеет id
«меня улыбающийся»): CSS:
@media print {
* {
display:none;
}
img#me-smiling {
display:block;
}
}
Javascript:
window.onload = function() { window.print() }
Я думаю, что в лучшем случае вам понадобится компонент ActiveX с использованием базового API окон для получения контекста устройства для принтера по умолчанию и попробуйте распечатать встроенное изображение с использованием предполагаемых значений параметров принтера.
Чтобы автоматически распечатывать принтер по умолчанию, не видя подсказки диалогового окна печати, я поделился некоторым кодом в следующем вопросе, который работает в IE7, IE8 и IE9:
Единственное решение, чтобы избежать диалогового окна печати, которое я нашел, - это создать переменную в Mozilla Firefox для установки автоматической печати. Возможно, это не лучшее решение, если вам нужно использовать другой браузер, но в моем случае мне нужно только распечатать отчет автоматически, и он работает:
1- Откройте Firefox и введите «about: config» в адресная строка 2- Щелкните правой кнопкой мыши по любому предпочтению и выберите «Создать»> «Логическое». 3. Добавьте переменную с именем «print.always_print_silent» с «истинным» значением. 4 Перезапустите Firefox.
Надеемся помочь вам !
AttendStar создал бесплатное дополнение, которое подавляет диалоговое окно и удаляет все верхние и нижние колонтитулы для большинства версий Firefox.
https://addons.mozilla.org/en-US / firefox / addon / attendprint /
С помощью этой функции вы можете использовать $ ('img'). jqprint (); и jqprint для jquery будет печатать только то, что автоматически вызывается из вашего веб-приложения.
Это лучшее решение, которое я нашел для firefox: есть эта потрясающая надстройка Бесшовная печать.
Это работает как прелесть.
Насколько я знаю, невозможно напрямую печатать документ без вмешательства клиента, например, устанавливать флаги браузера. В нашем текущем проекте нам нужно напрямую печатать на принтере по умолчанию, но, по крайней мере, с помощью Chrome вы можете сделать это легко с дополнительными аргументами для запуска.
Чтобы печатать непосредственно на принтере по умолчанию ОС, вы можете использовать:
"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --user-data-dir=c:\tmp --kiosk-printing http://www.contoso.com
Другим вариантом, который также может быть полезным, является использование встроенного диалогового окна печати вместо предварительного просмотра хромосов.
"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --user-data-dir=c:\tmp --disable-print-preview http://www.contoso.com
Обратите внимание, что window.print()
и / или Ctrl-P ведут соответственно указанные настройки.
Я знаю, что это точно не отвечает на вопрос OPs, но я думаю, что это несколько связано, и для веб-приложений для предприятий это довольно распространенный случай использования. Возможно, кому-то это будет полезно.
Для Firefox я рекомендую Бесшовные печати Addon
Из множества поисков за последние несколько дней я нашел наилучшее решение. До сих пор Chrome не поддерживает прямую печать с javascript. Он запустил USB и последовательный API, которые могут помочь.
Но в настоящее время я использую решение JavaApplet, которое является открытым исходным кодом. https://github.com/qzind/qz-print - build Пока я получаю ошибку при его создании. Я предпочел готовое приложение Prebuilt - QZ Print Plugin 1.9.3, которое отлично работает.
Загрузите его здесь: https://qz.io/download/
Пример кода:
/***************************************************************************
* Prototype function for printing an HTML screenshot of the existing page
* Usage: (identical to appendImage(), but uses html2canvas for png rendering)
* qz.setPaperSize("8.5in", "11.0in"); // US Letter
* qz.setAutoSize(true);
* qz.appendImage($("canvas")[0].toDataURL('image/png'));
***************************************************************************/
function printHTML5Page() {
$("#qz-status").html2canvas({
canvas: hidden_screenshot,
onrendered: function() {
if (notReady()) { return; }
// Optional, set up custom page size. These only work for PostScript printing.
// setPaperSize() must be called before setAutoSize(), setOrientation(), etc.
qz.setPaperSize("8.5in", "11.0in"); // US Letter
qz.setAutoSize(true);
qz.appendImage($("canvas")[0].toDataURL('image/png'));
//qz.setCopies(3);
qz.setCopies(parseInt(document.getElementById("copies").value));
// Automatically gets called when "qz.appendFile()" is finished.
window['qzDoneAppending'] = function() {
// Tell the applet to print.
qz.printPS();
// Remove reference to this function
window['qzDoneAppending'] = null;
};
}
});
}
Полный пример можно найти здесь: https://gist.github.com/bkrajendra/c80de17b627e59287f7c
Вы не можете обойти диалоговое окно печати, насколько я знаю. Это было бы довольно очевидным недостатком безопасности, если бы браузер разрешил это. Но вы можете открыть диалог печати с помощью «window.print ()».