Ответы пользователя admax - CodeHelper

admax

admax
Карма 2924
Имя Евгений
Возраст Неизвестно
Сайт Неизвестно
Twitter @codehelper_ru
Участвует в проекте 1117 дн., 17 час., 54 мин.
Последняя активность 418 дн., 10 час., 24 мин. назад
О себе ничего не указано

Ответы

Новые Лучшие
1
2
3
4
5
6
...
13
Перейти к вопросу →

Есть много встраиваемых (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-приложений) — наличие логики обращения к базе в коде формы. При нормальном подходе к архитектуре, эта логика должна инкапсулироваться в специальном классе. Если интересно, как архитектурно правильно реализовать настольное приложение, прочитайте классический труд Мартина Фаулера в пяти томах:

В качестве быстрого решения, можно вынести логику работы с базой в специальный слой. Для этого нужно:

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 ) );

1
2
3
4
5
6
...
13
v1.7.123.556
© 2009—2010 CodeHelper FAQ | О сайте | Обратная связь | История изменений | Статьи
Creative Commons LicenseМатериалы сайта распространяются под лицензией Creative Commons Attribution-Share Alike 3.0 Unported.