Zaldy1028 Ответов: 0

Почему findcontrol в GridView не работает после таблицы.колонки.removeat


Я хочу иметь элемент управления gridview в C#.net что он может переключаться между 15 и 10 столбцами в зависимости от булевой переменной.
У меня есть здесь метод, в котором я передам DataTable, и он визуализирует его должным образом.
private void RenderDataTableToGrid(DataTable dt)
{
    //initialize controls
    int gvcolCount = gvMandayEntry.Columns.Count;
    pjkMain = itfinance_dataload_pjk.GetPjkMainRecord(PjkId);
    IsCarryFoward = IsProjectCarryForward(pjkMain);

    List<xreffy> FYlist = XrefTable(dt);
    for (int cols = 2; cols < dt.Columns.Count; cols++)
    {
        gvMandayEntry.Columns[cols].HeaderText = dt.Columns[cols].ColumnName;
    }

    if (!IsCarryFoward)
    {
        while (dt.Columns.Count != gvMandayEntry.Columns.Count)
        {
            gvMandayEntry.Columns.RemoveAt(12);
        }
    }
    //Load Data
    gvMandayEntry.DataSource = dt;
    gvMandayEntry.DataBind();

    for (int x = 0; x < dt.Rows.Count; x++)
    {
        Label Category = (Label)gvMandayEntry.Rows[x].Cells[0].FindControl("Categories");
        Label Type = (Label)gvMandayEntry.Rows[x].Cells[1].FindControl("Type");

        Category.Text = dt.Rows[x][0].ToString();
        Type.Text = dt.Rows[x][1].ToString();

        for (int y = 2; y < dt.Columns.Count; y++)
        {
            TextBox txt = (TextBox)gvMandayEntry.Rows[x].Cells[y].FindControl(FYlist.Find(fy => fy.finyear == dt.Columns[y].ColumnName).control_name);
            txt.Text = dt.Rows[x][y].ToString();
        }
    }
    divMandaysEntry.Visible = true;

    Session["dtManday"] = dt;
}
Когда пользователю приходит время нажать кнопку Сохранить, логика кода заключается в том, чтобы перечитывать GridView для каждой строки с помощью "FindControl".
Это прекрасно работает, если gvMandayEntry.Столбцы.RemoveAt(12); строка из RenderDataTableToGrid не была выполнена во время выполнения.

Но если он выполняется, то FindControl возвращает Null.
for (int x = 0; x < gvMandayEntry.Rows.Count; x++)
{
    Label Category = (Label)gvMandayEntry.Rows[x].Cells[0].FindControl("Categories");
    Label Type = (Label)gvMandayEntry.Rows[x].Cells[1].FindControl("Type");

    int manday_category_id = MdCatList.Find(mdcat => mdcat.name == Category.Text).id;
    int pex_id = ExpenseType.Find(pex => pex.name == Type.Text).id;
    int manday_id = MdList.Find(mditm => mditm.mandays_categories_id == manday_category_id && mditm.pex_id == pex_id).id;
}


Что я уже пробовал:

Если GridView не изменяется во время выполнения кода, FindControl работает.

0x01AA

Вы удалили колонку и теперь ожидаете, что найдете ее позже?
Подумайте о том, что вместо удаления столбца вы просто установите значение Visible в false.

Zaldy1028

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

Я попробую установить видимое значение false.

0x01AA

Уупс, извини. В таком случае забудьте мой комментарий :)

Zaldy1028

Спасибо за помощь. Думаю, на данный момент у меня есть обходной путь.

0 Ответов