admax
- Вопросы
- Ответы
Имя | Евгений |
Возраст | Неизвестно |
Сайт | Неизвестно |
@codehelper_ru | |
Участвует в проекте | 1117 дн., 17 час., 54 мин. |
Последняя активность | 418 дн., 10 час., 24 мин. назад |
Ответы
Перейти к вопросу →
Есть много встраиваемых (embedded) движков баз данных, которые идеально подходят для таких задач. В случае их приминения, все данные хранятся в одном файле, который просто копируется в ходе установки приложения. В остальном работа ведётся как в случае обычной базы, только в connection string нужно указывать путь к файлу с данными.
Перейти к вопросу →
Если речь идёт о кодировке UTF-8, то можно использовать проект Utf8Checker. Проект состоит из одного класса (и интерфейса к нему), который и делает всю работу.
Перейти к вопросу →
Если конфигурация расположена в Web.config приложения, то можно в Global.asax (не знаю, возможно ли это для Sharepoint) подписаться на событие старта приложения и произвести инициализацию log4net:
log4net.Config.XmlConfigurator.Configure();
Альтернативный вариант — использовать атрибут XmlConfigurator
. Его нужно применить к своей сборке (файл Properties.cs
). Чтобы сконфигурировать с настройками из Web.config:
[assembly: log4net.Config.XmlConfigurator()]
Чтобы сконфигурить с настройками из файла Log4Net.config:
[assembly: log4net.Config.XmlConfigurator(
ConfigFile="Log4Net.config", Watch=true )]
В случае с SharePoint может потребоваться жесткое указание путей к файлам. Например, если Log4Net.config лежит в папке 12:
[assembly: log4net.Config.XmlConfigurator(ConfigFile =
@"C:\Program Files\Common Files\Microsoft Shared\" +
@"Web Server Extensions\12\Log4Net.config", Watch = true)]
Или, если прокатит, то так:
[assembly: log4net.Config.XmlConfigurator(ConfigFile =
SPUtility.GetGenericSetupPath(@"Log4Net.config"),
Watch = true)]
Перейти к вопросу →
Готовое решение здесь, конечно, предложить сложно, но могу посоветовать несколько направлений.
Во-первых, нужно убрать чисто служебный код:
button1.Anchor = (AnchorStyles.Right | AnchorStyles.Top);
textBox1.Anchor = (AnchorStyles.Right | AnchorStyles.Top | AnchorStyles.Left);
label1.Anchor = (AnchorStyles.Right | AnchorStyles.Top | AnchorStyles.Left);
textBox2.Anchor = (AnchorStyles.Right | AnchorStyles.Top);
label2.Anchor = (AnchorStyles.Right | AnchorStyles.Top);
dataGridView1.Anchor = (AnchorStyles.Right | AnchorStyles.Bottom | AnchorStyles.Top | AnchorStyles.Left);
label3.Anchor = (AnchorStyles.Bottom | AnchorStyles.Left);
listBox1.Anchor = (AnchorStyles.Bottom | AnchorStyles.Right | AnchorStyles.Left);
/*---header---*/
Column3.HeaderCell.Style.BackColor = System.Drawing.Color.Blue;
Column3.HeaderCell.Style.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Underline);
Все эти действия (настройка внешнего вида и расположения компонентов) можно выполнить непосредственно в дизайнере формы. Тогда весь этот код переместиться в автогенерирующийся файл и не будет смешиваться с логикой формы (реакция на события и т.п.).
Во-вторых, основное зло приведённого кода (как и многих других WinForms-приложений) — наличие логики обращения к базе в коде формы. При нормальном подходе к архитектуре, эта логика должна инкапсулироваться в специальном классе. Если интересно, как архитектурно правильно реализовать настольное приложение, прочитайте классический труд Мартина Фаулера в пяти томах:
- Martin Fowler — GUI Architectures (перевод). Часть 1
- Martin Fowler — GUI Architectures (перевод). Часть 2
- Martin Fowler — GUI Architectures (перевод). Часть 3
- Martin Fowler — GUI Architectures (перевод). Часть 4
- Martin Fowler — GUI Architectures (перевод). Часть 5
В качестве быстрого решения, можно вынести логику работы с базой в специальный слой. Для этого нужно:
1) Создать класс предметной области:
public class Feed
{
public string Id { get; set; }
public string Name { get; set; }
public string Url { get; set; }
}
2) Создать интерфейс для слоя доступа к данным:
public interface IFeedRepository
{
IEnumerable<Feed> GetAllFeeds();
}
3) Создать реализацию интерфейса доступа к данным:
public class AdoNetFeedRepository : IFeedRepository
{
// ...
public IEnumerable<Feed> GetAllFeeds()
{
var result = new List<Feed>();
SqlConnection cn = new SqlConnection(strConn);
SqlCommand cmd = new SqlCommand("Select FeedID, Feed, Nameoffeed FROM edik_1", cn);
try
{
cn.Open();
SqlDataReader rdr = default(SqlDataReader);
rdr = cmd.ExecuteReader();
while (rdr.Read())
{
result.Add(new Feed
{
Id = rdr["FeedID"],
Name = rdr["Nameoffeed"],
Url = rdr["Feed"]
});
}
rdr.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
finally
{
if ((cn != null))
{
cn.Close();
}
}
return result;
}
}
4) На форме использовать созданный слой доступа к данным:
// ...
var allFeeds = feedRepository.GetAllFeeds();
foreach(var feed in allFeeds)
{
dataGridView1.Rows.Add(feed.Id, feed.Url, feed.Name);
}
Перейти к вопросу →
Нужно указывать полный абсолютный пусть к файлу (вместе со схемой и доменом). Например, так:
<object data="data:application/x-silverlight-2,"
type="application/x-silverlight-2" width="640" height="360">
<param name="source" value="/ClientBin/VideoPlayerM.xap"/>
<param name="background" value="white" />
<param name="initParams"
value='m=<%=Request.Url.Scheme%>://<%=Request.Url.Authority%><%=Url.Content("~/Content/Video/example.wmv")%>' />
<param name="minruntimeversion" value="2.0.31005.0" />
<a href="http://go.microsoft.com/fwlink/?LinkId=124807" style="text-decoration: none;">
<img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight" style="border-style: none"/>
</a>
</object>
Перейти к вопросу →
Согласно рекомендациям W3C, элементы disabled
не должны включаться в POST-запрос. Если нужно запретить изменение некоторого поля, но включить его в submit, то лучше использовать атрибут readonly
. Следует, однако, иметь в виду:
- атрибут
disabled
поддерживается элементамиBUTTON
,INPUT
,OPTGROUP
,OPTION
,SELECT
, иTEXTAREA
. А атрибутreadonly
— только элементамиINPUT
иTEXTAREA
; - disabled-элементы отображаются браузерами действительно «недоступными», а readonly-элементы могут выглядеть точно также как обычные. Поэтому, для визуализации эффекта недоступности нужно использовать соответствующий CSS-класс;
- атрибут readonly запрещает только изменение value для элемента. При этом любое другое взаимодействие пользователя с элементом допустимо. Из этого следует, что, например, для чекбоксов (type=checkbox) readonly НЕ ЗАПРЕЩАЕТ пользователю отмечать этот чекбокс. Потому что при выделении изменяется
checked
, но неvalue
.
Перейти к вопросу →
Можно использовать RSS.NET. Эта библиотека берёт на себя загрузку фида, и отдаёт пользователю готовое к использование объектное представление этого фида. Код примерно такой:
var feedUrl = "http://codehelper.ru/rss/Questions";
var feed = RssFeed.Read(url);
На выходе, как уже сказал, имеем объект feed
, который можно сразу использовать. То есть не нужно ничего парсить и разбирать вручную.
Перейти к вопросу →
Можно использовать HtmlAgilityPack. Это готовый html парсер. Код парсинга представленной страницы может быть таким:
private static string GetImages(string page)
{
var doc = new HtmlDocument();
doc.LoadHtml(page);
var nodes = doc.DocumentNode
.SelectNodes("//div[@class='browse2-results']/*/div[@class='tt-a']");
return nodes
.Cast<HtmlNode>()
.Aggregate(
string.Empty,
(current, node) => current + node.OuterHtml);
}
Метод GetImages
принимает код страницы, а возвращает блоки с рисунками.
Перейти к вопросу →
В плагине jquery-json используется метод проверки, основанный на регулярных выражениях:
function isValidJSON(src) {
var filtered = src;
filtered = filtered.replace(/\\["\\\/bfnrtu]/g, '@');
filtered = filtered.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']');
filtered = filtered.replace(/(?:^|:|,)(?:\s*\[)+/g, '');
return (/^[\],:{}\s]*$/.test(filtered));
};
Перейти к вопросу →
В NUnit 2.4.2 появился helper-класс Has
для написания ассертов, проверяющих коллекции. Кроме того, стандартный хелпер Is
тоже может быть применен для некоторых проверок. Вот пример из официальной документации:
int[] iarray = new int[] { 1, 2, 3 };
string[] sarray = new string[] { "a", "b", "c" };
// Проверяем, что в массиве нет пустых элементов
Assert.That( iarray, Is.All.Not.Null );
// Проверяем, что в массиве только строки
Assert.That( sarray, Is.All.InstanceOfType(typeof(string)) );
// Проверяем, что все элементы больше чем 0
Assert.That( iarray, Is.All.GreaterThan(0) );
// Проверяем уникальность
Assert.That( sarray, Is.Unique );
// Проверка на наличие/отсутствие элементов
Assert.That( iarray, Has.Member(3) );
Assert.That( sarray, Has.Member("b") );
Assert.That( sarray, Has.No.Member("x") );
// Проверки на эквивалентность
Assert.That(
new string[] { "c", "a", "b" },
Is.EquivalentTo( sarray ) );
Assert.That( new int[] { 1, 2, 2 }, Is.Not.EquivalentTo( iarray ) );
Assert.That( new int[] { 1, 3 }, Is.SubsetOf( iarray ) );