Добавление динамических столбцов к Gridview ASP.NET

В Java все находится в форме класса.

Если вы хотите использовать любой объект, тогда у вас есть две фазы:

  1. Объявить
  2. Инициализация

Пример:

  • Объявление: Object a;
  • Инициализация: a=new Object();

То же самое для концепции массива

  • Объявление: Item i[]=new Item[5];
  • Инициализация: i[0]=new Item();

Если вы не дают секцию инициализации, тогда возникает NullpointerException.

15
задан Bill the Lizard 19 October 2011 в 15:31
поделиться

6 ответов

Я недавно завоевал проблемы silmilar с динамическими столбцами в gridviews, возможно, это поможет.

Первый поворот состояние отображения прочь
Второй добавляет столбцы программно в функции, запущенной в oninit событие
Наконец, я использовал следующий класс помощника, чтобы заставить флажки инстанцировать когда начатое событие RowDataBound. Да часть его трудно кодируется.

Heck здесь является всем кодом. Имейте в нем :) Warrenty, как, и тому подобное...

Наконец, так как я просто получаю ноги влажный DotNet, любые подсказки ценились бы [IE не разрывает меня слишком много :)]. И да 'одолжил' первоначальный код у сети где-нибудь, извините я не могу помнить первое, что пришло на ум :(

- Исчерпывают это в защищенном переопределении пустой OnInit

    private void GridViewProject_AddColumns()
    {
        DataSet dsDataSet = new DataSet();
        TemplateField templateField = null;

        try
        {
            StoredProcedure sp = new StoredProcedure("ExpenseReportItemType_GetList", "INTRANETWEBDB", Context.User.Identity.Name);
            dsDataSet = sp.GetDataSet();

            if (sp.RC != 0 && sp.RC != 3000)
            {
                labelMessage.Text = sp.ErrorMessage;
            }

            int iIndex = 0;
            int iCount = dsDataSet.Tables[0].Rows.Count;
            string strCategoryID = "";
            string strCategoryName = "";
            iStaticColumnCount = GridViewProject.Columns.Count;

            // Insert all columns immediatly to the left of the LAST column
            while (iIndex < iCount)
            {
                strCategoryName = dsDataSet.Tables[0].Rows[iIndex]["CategoryName"].ToString();
                strCategoryID = dsDataSet.Tables[0].Rows[iIndex]["CategoryID"].ToString();

                templateField = new TemplateField();
                templateField.HeaderTemplate = new GridViewTemplateExternal(DataControlRowType.Header, strCategoryName, strCategoryID);
                templateField.ItemTemplate = new GridViewTemplateExternal(DataControlRowType.DataRow, strCategoryName, strCategoryID);
                templateField.FooterTemplate = new GridViewTemplateExternal(DataControlRowType.Footer, strCategoryName, strCategoryID);

                // Have to decriment iStaticColumnCount to insert dynamic columns BEFORE the edit row
                GridViewProject.Columns.Insert((iIndex + (iStaticColumnCount-1)), templateField);
                iIndex++;
            }
            iFinalColumnCount = GridViewProject.Columns.Count;
            iERPEditColumnIndex = (iFinalColumnCount - 1); // iIndex is zero based, Count is not
        }
        catch (Exception exception)
        {
            labelMessage.Text = exception.Message;
        }
    }

- Класс

public class GridViewTemplateExternal : System.Web.UI.ITemplate
{
    #region Fields
    public DataControlRowType DataRowType;
    private string strCategoryID;
    private string strColumnName;
    #endregion

    #region Constructor
    public GridViewTemplateExternal(DataControlRowType type, string ColumnName, string CategoryID)
    {
        DataRowType = type; // Header, DataRow,
        strColumnName = ColumnName; // Header name
        strCategoryID = CategoryID;
    }
    #endregion

    #region Methods
    public void InstantiateIn(System.Web.UI.Control container)
    {
        switch (DataRowType)
        {
            case DataControlRowType.Header:
                // build the header for this column
                Label labelHeader = new Label();
                labelHeader.Text = "<b>" + strColumnName + "</b>";
                // All CheckBoxes "Look Up" to the header row for this information
                labelHeader.Attributes["ERICategoryID"] = strCategoryID;
                labelHeader.Style["writing-mode"] = "tb-rl";
                labelHeader.Style["filter"] = "flipv fliph";
                container.Controls.Add(labelHeader);
                break;
            case DataControlRowType.DataRow:
                CheckBox checkboxAllowedRow = new CheckBox();
                checkboxAllowedRow.Enabled = false;
                checkboxAllowedRow.DataBinding += new EventHandler(this.CheckBox_DataBinding);
                container.Controls.Add(checkboxAllowedRow);
                break;
            case DataControlRowType.Footer:
                // No data handling for the footer addition row
                CheckBox checkboxAllowedFooter = new CheckBox();
                container.Controls.Add(checkboxAllowedFooter);
                break;
            default:
                break;
        }
    }
    public void CheckBox_DataBinding(Object sender, EventArgs e)
    {
        CheckBox checkboxAllowed = (CheckBox)sender;// get the control that raised this event
        GridViewRow row = (GridViewRow)checkboxAllowed.NamingContainer;// get the containing row
        string RawValue = DataBinder.Eval(row.DataItem, strColumnName).ToString();
        if (RawValue.ToUpper() == "TRUE")
        {
            checkboxAllowed.Checked = true;
        }
        else
        {
            checkboxAllowed.Checked = false;
        }
    }
    #endregion
}
Помощника
5
ответ дан 1 December 2019 в 04:47
поделиться

diningphilanderer.myopenid.com имеет аналогичный подход к тому, что я рекомендовал бы.

проблема состоит в том, что необходимо снова переплести сетку каждый раз, когда обратная передача происходит, и следовательно необходимо восстановить столбцы. Мне нравится иметь метод под названием BindGrid (), который сначала очищает Столбцы GridView1. Столбцы. Ясный (); затем добавляет их программно, затем устанавливает источник данных и называет привязку данных. Удостоверьтесь, что Вам отключили состояние отображения для сетки, и у Вас есть autogeneratecolumns = ложь;

1
ответ дан 1 December 2019 в 04:47
поделиться

Я нашел это ранее сегодня: TemplateField в GridView не восстановили его ViewState, когда BoundFields введены .

Похож на ошибку, которую Microsoft не планирует на фиксации, таким образом, необходимо будет попробовать одно из решений выше. У меня есть та же проблема - у меня есть некоторый DataBoundFields и некоторый TemplateFields, и после того, как обратная передача, основанные на TemplateField столбцы теряют свои средства управления и данные.

1
ответ дан 1 December 2019 в 04:47
поделиться

Я нашел этот небольшой самородок в документации под Классом DataControlFieldCollection.

при использовании управления GridView или DetailsView объекты DataControlField, которые автоматически создаются (например, когда свойство AutoGenerateColumns верно) не хранятся в публично доступном полевом наборе. Можно только получить доступ и управлять объектами DataControlField, которые автоматически не сгенерированы.

я предполагаю, что ответ должен сделать все Ваше управление столбцом в коде, и затем Ваш подход должен хорошо работать.

0
ответ дан 1 December 2019 в 04:47
поделиться

Вместо того, чтобы динамично добавить столбцы, мог Вы определять их в начале и скрываться/показывать их по мере необходимости (или с Видимым = "ложь" или с установкой CssClass управления/заголовка/нижнего колонтитула к классу с "дисплеем:ничего;")? Я использую этот метод в части моего кода, включая шаблонные столбцы, без проблем.

0
ответ дан 1 December 2019 в 04:47
поделиться

Извините, Палубное судно. Я упустил несколько ключевой сути, очевидно.. :)

, Если это - все еще проблема для Вас, интересно, имеет ли это значение, что Вы имеете в своем шаблоне объекта? Если Вы просто помещаете некоторый текст там, то обновляете страницу несколько раз, текст появляется на первой загрузке, то не на втором?

кроме того, то, когда проблема возникает, является там какой-либо разметкой HTML вообще в ячейках, или действительно ли они абсолютно пусты?

0
ответ дан 1 December 2019 в 04:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: