ASP.NET Gridview — Динамический в коде — ненулевая таблица данных в качестве источника — DataBind выдает исключение

#c# #asp.net #gridview #boundfield

#c# #asp.net #gridview #boundfield

Вопрос:

C # ASP.Net 4.7.2

Я создаю Gridview в коде на основе переданного набора данных. Я создаю BoundFields на лету, а затем назначаю источник данных и пытаюсь привязать данные. Этот код находится в отдельном классе. к которому я передаю заполнитель со страницы.

Вот код:

     DGWorkWith = new GridView()
    {
        AllowPaging = true,
        AllowSorting = true,
        PageSize = 50,
        AutoGenerateColumns = false,
        BorderColor = Color.Black,
        BorderWidth = 1
    };
    DataSet wwDS = LoadDataSet(_sDB,_sPW);
    DataTable wwDT = wwDS.Tables[0];
    foreach (DataColumn DC in wwDT.Columns)
    {
        string sColName = DC.ColumnName.ToUpper().Trim();
        string sWidth = myRM.GetString(sColName   "_WIDTH");
        if (sWidth == null) { sWidth = "120"; }
        int iWidth = Convert.ToInt32(sWidth);
        //if (IsFieldChooserColumnOn(sColName)) { continue; }
        // Put DataColumn in List
        string sColHdr = "";
        if (myRM.GetString(sColName) == null)
        {
            sColHdr = "???-"   DC.ColumnName.ToUpper().Trim();
        }
        else
        {
            sColHdr = myRM.GetString(sColName);
        }

        BoundField BC = new BoundField();
        BC.DataField = DC.ColumnName.Trim();
        BC.HeaderText = sColHdr;
        if(iWidth==0) { BC.Visible = false;  }
        DGWorkWith.Columns.Add(BC);
    }
    DGWorkWith.DataSource = wwDT;
    // *** THIS DATABIND FAILS with an Object reference not set to an instance of an object.
    DGWorkWith.DataBind();
    TR2TC2.Controls.Add(DGWorkWith);
    
    TR2.Cells.Add(TR2TC2);
    T.Rows.Add(TR2);
    placeHolder.Controls.Add(T); //T is a Table and the placeholder is fed the table.
  

Вызов DataBind завершается ошибкой с исключением ссылки на нулевой объект.

  • DGWorkWith не равен нулю
  • Все столбцы присутствуют для каждого столбца данных в таблице данных
  • Имена столбцов в полях границ совпадают с именами столбцов в таблице данных.
  • В таблице данных есть строки — их более 12000.
  • Попытка войти в привязку данных сразу вызывает исключение.

Я полностью озадачен.

Кто-нибудь видит что-то, что я пропустил?

Спасибо! Джон.

Комментарии:

1. Что бы я ни пытался, код работает. Я не могу воспроизвести проблему… Вы уверены, что проблема не где-то еще, поскольку вы можете привязать null к GridView ( DGWorkWith.DataSource = null; показывает пустой GridView)

2. Я могу привязать null к gridview, и он не показывает ничего, кроме данных. — который имеет столбцы и строки и где каждое имя столбца соответствует имени столбца в таблице данных.

Ответ №1:

Я нашел проблему. Это было в этом коде здесь:

 TR2TC2.Controls.Add(DGWorkWith);

TR2.Cells.Add(TR2TC2);
T.Rows.Add(TR2);
placeHolder.Controls.Add(T); //T is a Table and the placeholder is fed the table.
  

Проблема в том, что я пытался привязать данные до того, как прикрепил GridView к любому элементу управления. По-видимому, динамический GridView должен быть элементом управления где-то на странице до привязки данных.

Вау.

Microsoft настолько хороша в документировании подобных вещей.