Linq 2 SQL - Ручная привязка данных не работает

Я использую linq2sql в моем приложении asp.net. При использовании его с объектом linq2sqldatasource все работает, я имею в виду, что я связываю его без кода с элементом управления detailsview. Моя идея заключается в том, что когда я щелкаю строку в элементе detailscontrol, он загружает / добавляет на ту же страницу настраиваемый веб-элемент управления, который позволяет редактировать данные. Для этого мне нужно загрузить некоторые элементы, чтобы заполнить выпадающие списки в этом пользовательском контроле, и в его событии загрузки у меня есть следующий код, который не работает, и я не могу понять, почему. Это вызывает исключение нулевой ссылки объекта.

пример:


        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                //loads combobox with  organizations
                using (MyDataContext cdc = new MyDataContext())
                {
                    var queryOrgs = from p in cdc.orgUnits
                                    select p;

                    //Organizations
                    dropDownOrgs.DataSource = queryOrgs.ToList();
                    dropDownOrgs.DataValueField = "orgUnitID";
                    dropDownOrgs.DataTextField = "orgUnitName";
                    dropDownOrgs.DataBind();
                }
            }
        }

Кто-нибудь знает, что происходит? Похоже, когда я хочу связать все вручную, что-то не работает :(

Надеюсь, ты сможешь мне помочь.

Спасибо. Тейшейра

12.10.2009 22:22:32
что произойдет, если вы не примените метод ToList ()?
user110714 12.10.2009 22:26:02
Спасибо, ребята! На самом деле ToList () получает результаты из базы данных, потому что я могу наблюдать queryObject и он содержит записи, но, с другой стороны, он продолжает вызывать исключение нулевой ссылки ... Есть еще идеи? Самым странным является то, что с контролем данных linq2sql он связывается нормально. [EDITED] На самом деле элемент управления выпадающего списка имеет значение null ... его не должно ... обычно в случае загрузки элементы управления должны создаваться правильно, не так ли? br, Тейшейра
byte_slave 12.10.2009 22:43:43
я прокомментировал код, поместил его в отдельный метод и вызвал его по-другому, и он связывается, поэтому проблема в том, что выпадающий список по любой причине не устанавливается при запуске события load .... но возникает другой вопрос / сомнение: Не предполагалось ли какое-либо веб-управление или, в этом случае, mycustomcontrol, если свойство visible = false не обрабатывается на стороне сервера? В этом случае он даже не должен запускать событие загрузки ... Спасибо. br, Тейшейра
byte_slave 12.10.2009 22:59:05
Хорошо. Я нашел маленькие детали, которые все испортили. Я довольно новичок или снова вернулся на asp.net, и я только что обнаружил, что рефактор vs2008 не выполняет рефакторинг внутри разметки, поэтому в основном я переименовал выпадающие списки, и у разметки все еще были оригинальные имена, поэтому управление выпадающим списком никогда не создавалось , Задача решена. Спасибо, ребята, что уделили мне время. br, Teixeira
byte_slave 12.10.2009 23:10:14
1 ОТВЕТ
РЕШЕНИЕ

@ Чалки это правильно. Я сам столкнулся с этой ошибкой, когда из-за того, что LINQ to SQL выполняет «ленивые» запросы, он ожидает до последней минуты, чтобы фактически выполнить запрос.

Это означает, что он может подождать, пока функция page_load не выполнит запрос (и, следовательно, за пределами оператора using).

Поэтому возвращайте данные в виде списка с помощью .ToList (), чтобы заставить его немедленно выполнить запрос.

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        //loads combobox with  organizations
        using (MyDataContext cdc = new MyDataContext())
        {
            List<orgUnit> queryOrgs = (
                from p in cdc.orgUnits
                select p
                ).ToList();

            //Organizations
            dropDownOrgs.DataSource = queryOrgs.ToList();
            dropDownOrgs.DataValueField = "orgUnitID";
            dropDownOrgs.DataTextField = "orgUnitName";
            dropDownOrgs.DataBind();
        }
    }
}
1
12.10.2009 22:29:30