С jQuery Вы используете $(document).ready()
для выполнения чего-то, когда DOM загружается и $(window).on("load", handler)
для выполнения чего-то, когда все другие вещи загружаются также, такие как изображения.
различие видно в следующем полном файле HTML, если Вы имеете jollyroger
файлы JPEG (или другие подходящие):
<html>
<head>
<script src="jquery-1.7.1.js"></script>
<script type="text/javascript">
$(document).ready(function() {
alert ("done");
});
</script>
</head><body>
Hello
<img src="jollyroger00.jpg">
<img src="jollyroger01.jpg">
// : 100 copies of this
<img src="jollyroger99.jpg">
</body>
</html>
С этим, окно предупреждений появляется, прежде чем изображения загружаются, потому что DOM готов в той точке. Если Вы затем изменяетесь:
$(document).ready(function() {
в:
$(window).on("load", function() {
затем окно предупреждений не появляется, до после изображения загружаются.
Следовательно, для ожидания, пока вся страница не готова, Вы могли использовать что-то как:
$(window).on("load", function() {
// weave your magic here.
});
Абсолютно есть более чистый способ написать этот код, если вы используете .NET 3.5, и без повторного изобретения методов расширения, которые Microsoft уже написала для вас. Просто добавьте ссылку на System.Data.DataSetExtensions.dll , и вы сможете сделать это:
MyObject pymt = new MyObject
{
xcol1id = row.Field<int?>("col1id") ?? 0,
xcol2id = row.Field<string>("col2id") ?? String.Empty,
xcol3id = row.Field<decimal?>("col3id") ?? 0M
};
Вы можете создать общие методы расширения, подобные этому:
public static class DataRowExtensions {
public static T GetValueOrDefault<T>(this DataRow row, string key) {
return row.GetValueOrDefault(key, default(T));
}
public static T GetValueOrDefault<T>(this DataRow row, string key, T defaultValue) {
if (row.IsNull(key)) {
return defaultValue;
} else {
return (T)row[key];
}
}
}
Использование:
MyObject pymt = new MyObject();
pymt.xcol1id = row.GetValueOrDefault<int>("col1id");
pymt.xcold2id = row.GetValueOrDefault<string>("col2id", String.Empty);
pymt.xcold3id = row.GetValueOrDefault<int>("CustNum"]);
Я обычно использую нулевой оператор объединения в подобных ситуациях. Кроме того, DBNull.ToString возвращает string.Empty, поэтому вам не нужно делать ничего особенного.
MyObject pymt = new MyObject();
pymt.xcol1id= row["col1id"] as int? ?? 0;
pymt.xcold2id= row["col2id"].ToString();
pymt.xcold3id = row["CustNum"] as decimal? ?? 0;
Еще лучше, добавьте его как метод расширения в DataRow
:
static T GetValueOrDefault<T>(this DataRow row, string columnName)
{
if (!row.IsNull(columnName))
{
// Might want to support type conversion using Convert.ChangeType().
return (T)row[columnName]
}
return default(T);
}
Вы можете использовать его как:
pymt.xcol1id = row.GetValueOrDefault<int>("col1id");
pymt.xcol2id = row.GetValueOrDefault<string>("col2id");
pymt.xcol3id = row.GetValueOrDefault<decimal>("col3id");
static ToType GenericConvert<ToType>(object value)
{
ToType convValue = default(ToType);
if (!Convert.IsDBNull(value))
convValue = (ToType)value;
return convValue;
}
MyObject pymt = new MyObject();
pymt.xcol1id= GenericConvert<int>(row["col1id"]);
pymt.xcold2id= GenericConvert<string>(row["col2id"]) ?? String.Empty;
pymt.xcold3id = GenericConvert<decimal>(row["CustNum"]);
Некоторые альтернативы, которые я могу быстро придумать:
Мне это вообще нравится. Наша команда использовала операторы if / else, которые, на мой взгляд, труднее читать.
if (row["col1id"] == dbnull.value)
pymt.xcol1id = 0;
else
pymt.xcol1id = (int)row["col1id"];
Ваш код легче читать, потому что он помещает каждое присваивание в отдельные строки.
Функция, предложенная Стэном, может создавать строки. короче, но он скрывает тот факт, что значения NULL заменяются, если вы не дадите ему очень подробное имя.