GridView.Columns.Add против GridView.Columns.Insert и GirdViewRow.FindControl

Я заметил кое-что, что я нахожу странным. Поэтому я хотел бы получить объяснение того, как это работает таким образом.

У меня есть GridView, например:

    <asp:GridView ID="_grdFordelinger" runat="server" CssClass="grid" AutoGenerateColumns="False">
        <Columns>
            <asp:TemplateField>
                <HeaderTemplate>
                    Vælg
                </HeaderTemplate>
                <ItemTemplate>
                    <asp:CheckBox ID="FordelingCheckBox" runat="server" />
                </ItemTemplate>
                <ItemStyle HorizontalAlign="Center" />
            </asp:TemplateField>
        </Columns>
    </asp:GridView>

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

        foreach (GridViewRow row in _fordelingsSelector.Rows)
        {
            foreach (TableCell cell in row.Cells)
            {
                foreach (Control control in cell.Controls)
                {
                    if(control is CheckBox)
                        Trace.Write("I FOUND A CHECKBOX!!!");
                }
            }
        }

Or:

        foreach (GridViewRow row in _fordelingsSelector.Rows)
        {
            var checkBox = (CheckBox) row.FindControl("FordelingCheckBox");

            if (checkBox.Checked)
                Trace.Write("I will now delete fordeling with id: " + row.Cells[1].Text);
        }

Я пробовал оба способа, и оба они работают, когда я добавляю дополнительные столбцы в GridView с помощью Columns.Add, например:

        foreach (var boundField in boundFields)
        {
            _grdFordelinger.Columns.Add(boundField);
        }

Но я бы хотел, чтобы столбец CheckBox был самым правым столбцом, поэтому я подумал, что не будет иметь значения добавление столбцов с помощью Columns.Insert, например:

        for (int i = 0; i < boundFields.Count; i++)
        {
            _grdFordelinger.Columns.Insert(i, boundFields[i]);
        }

Но теперь я больше не могу найти CheckBoxes, используя приведенный выше код (изменение индекса ячейки с 1 на 0 теперь, когда столбец CheckBox является самым правым столбцом). Почему это? Почему столбец CheckBox должен быть крайним слева?

Заранее большое спасибо


person Søren Pedersen    schedule 22.07.2010    source источник
comment
Имея точно такую ​​же проблему. Вы когда-нибудь догадывались об этом?   -  person Mark Miller    schedule 19.05.2015
comment
Привет Марк. Нет, к сожалению, я не думаю, что когда-либо находил удовлетворительное решение. Я давно ушел с этого проекта   -  person Søren Pedersen    schedule 20.05.2015


Ответы (2)


когда вы вставляете элемент в список - он сдвигает индекс всех элементов после него на 1

вы должны сделать что-то похожее на:

foreach (GridViewRow row in _fordelingsSelector.Rows)
    {
        var checkBox = (CheckBox) row.FindControl("FordelingCheckBox");

        if (checkBox.Checked)
            Trace.Write("I will now delete fordeling with id: " + row.Cells[row.Cells.Count-1].Text);
    }
person Lee Elenbaas    schedule 30.08.2010
comment
Привет Ли. Спасибо за ответ, но он не отвечает на мой вопрос. Я знаю все элементы после того, как он нажат - и это то, что я хочу - person Søren Pedersen; 31.08.2010
comment
Тогда мне нужно разъяснение проблемы: (1) вы начинаете со столбца флажка, единственного с индексом 0 (2) Если вы добавляете столбцы с помощью метода Columns.Add, флажок остается с индексом 0 и находится в крайнем левом (3) Если вы добавляете столбцы с помощью Columns.Insert(i...), флажки должны быть слева и располагаться по индексу Columns.Count-1. - person Lee Elenbaas; 07.09.2010

У меня нет ответа, но у меня точно такая же проблема. Я надеюсь, что Сорен ответит, если он в конце концов найдет ответ. Если нет, я надеюсь, что кто-то другой ответит с решением или обходным путем.

С уважением,

Боб Аваллоне

person Bob Avallone    schedule 08.11.2010
comment
К сожалению, я еще не получил ответа. На данный момент я остановился на флажке в крайнем левом углу. - person Søren Pedersen; 10.11.2010