Перебор данных по строкам GridView
От: Махмуд  
Дата: 27.07.06 07:26
Оценка:
Привет всем.

Есть две таблицы — роли и отчеты. Каждой роли назначена своя группа отчетов. Мне нужно сделать следующим образом — когда я жму Edit у роли, мне в EditTemplate должна выдаваться таблица с отчетами, и против каждого отчета должна стоять/не стоять галочка. Собственно проблемы две:

1. Как добавить GridView в EditTemplate, это понятно. Но как сделать так, чтобы чекбоксы (поле Permitted) были заполнены соответствующими значениями, и чтобы я мог чекать/анчекать каждый, не переводя каждую строку в режим Edit?
2. После того, как я отметил все чекбоксы, как мне записать в базу все значения из грида? Что-то мне говорит, что нужен перебор строк грида? Или есть способ покрасивее?

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

Заранее спасибо.
Re: Перебор данных по строкам GridView
От: Махмуд  
Дата: 27.07.06 08:01
Оценка:
эээ... забыл еще спросить — а как, собственно, делается сам перебор строк в GridView?
Re: Перебор данных по строкам GridView
От: Dronopotamus Россия  
Дата: 27.07.06 08:41
Оценка:
Здравствуйте, Махмуд, Вы писали:

М>1. Как добавить GridView в EditTemplate, это понятно. Но как сделать так, чтобы чекбоксы (поле Permitted) были заполнены соответствующими значениями, и чтобы я мог чекать/анчекать каждый, не переводя каждую строку в режим Edit?


<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataSourceID="SqlDataSource1">
 <Columns>
     <asp:BoundField DataField="LastName" HeaderText="LastName" SortExpression="LastName" />
     <asp:TemplateField HeaderText="Checkbox" />
 </Columns>
</asp:GridView>


в коде
public partial class Default2 : System.Web.UI.Page
{
    public void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            TemplateField column = (TemplateField)GridView1.Columns[1];
            column.ItemTemplate = new CheckboxTemplate();
            column.EditItemTemplate = new CheckboxTemplate();
        }
    }
}

public class CheckboxTemplate : ITemplate
{
    private CheckBox _checkbox;
    private Control _container;

    public void InstantiateIn(Control container)
    {
        _checkbox = new CheckBox();
        _container = container;
        _checkbox.DataBinding += new EventHandler(_checkbox_DataBinding);
        container.Controls.Add(_checkbox);
    }

    void _checkbox_DataBinding(object sender, EventArgs e)
    {
        GridViewRow gridViewRow = (GridViewRow)_container.BindingContainer;
        DataRowView realData = (DataRowView)gridViewRow.DataItem;
        _checkbox.Checked = Convert.ToBoolean(realData["Permitted"]);
    }
}
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Удар судьбы в лоб означает, что не возымели действия ее пинки под зад
Re: Перебор данных по строкам GridView
От: mogadanez Чехия  
Дата: 27.07.06 08:43
Оценка:
Здравствуйте, Махмуд, Вы писали:

М>Заранее спасибо.


честно говоря немного непонятно проблема и в каком сотоянии она сейчас.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Re[2]: Перебор данных по строкам GridView
От: mogadanez Чехия  
Дата: 27.07.06 08:43
Оценка:
Здравствуйте, Махмуд, Вы писали:

М>эээ... забыл еще спросить — а как, собственно, делается сам перебор строк в GridView?


foreach ( GridViewRow  row in GridView1.Rows )
{
}
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Re[2]: Перебор данных по строкам GridView
От: Махмуд  
Дата: 27.07.06 09:03
Оценка:
Здравствуйте, Dronopotamus, Вы писали:

D>
D><asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataSourceID="SqlDataSource1">
D> <Columns>
D>     <asp:BoundField DataField="LastName" HeaderText="LastName" SortExpression="LastName" />
D>     <asp:TemplateField HeaderText="Checkbox" />
D> </Columns>
D></asp:GridView>
D>


Угу, это понятно, большое спасибо.
Собственно, еще вопрос, вдогонку — поскольку этот грид находится в EditTemplate родительского грида, есть какие-нибудь события типа "начала редактирования" или "окончания редактирования" родительского грида, по которому я мог бы начать заполнять дочерний грид или начать его писать в базу?
Re[3]: Перебор данных по строкам GridView
От: Dronopotamus Россия  
Дата: 27.07.06 09:20
Оценка:
Здравствуйте, Махмуд, Вы писали:

М>Собственно, еще вопрос, вдогонку — поскольку этот грид находится в EditTemplate родительского грида, есть какие-нибудь события типа "начала редактирования" или "окончания редактирования" родительского грида, по которому я мог бы начать заполнять дочерний грид или начать его писать в базу?


дочерний грид я бы заполнял тоже по событию DataBinding
а так конечно в гридвью события есть — RowEditing, RowUpdating, RowCancelingEditing...
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Удар судьбы в лоб означает, что не возымели действия ее пинки под зад
Re[3]: Перебор данных по строкам GridView
От: Махмуд  
Дата: 27.07.06 11:40
Оценка:
Здравствуйте, mogadanez, Вы писали:

M>
M>foreach ( GridViewRow  row in GridView1.Rows )
M>{
M>}
M>


Хм... Это значит, что в гриде должны присутствовать все поля. Если мне надо сделать такое вот:



update Reports set Permitted = @Permitted where ReportID = @ReportID


а у меня в строке грида есть только название отчета и чекбокс, то я, по идее, не получу этот самый ReportID, потому как его нету в Rows. Что тогда делать?
Re[4]: Перебор данных по строкам GridView
От: Dronopotamus Россия  
Дата: 27.07.06 11:52
Оценка:
Здравствуйте, Махмуд, Вы писали:

М>Хм... Это значит, что в гриде должны присутствовать все поля.


не означает
ключевое поле должно присутствовать в датасете, а в гриде не обязательно
у GridViewRow есть сво-во DataItem, которое является DataRowView — оттуда и бери значение ключевого поля
вообще это все видно из моего кода ниже
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Удар судьбы в лоб означает, что не возымели действия ее пинки под зад
Re[5]: Перебор данных по строкам GridView
От: Махмуд  
Дата: 27.07.06 12:10
Оценка:
Здравствуйте, Dronopotamus, Вы писали:

D>ключевое поле должно присутствовать в датасете, а в гриде не обязательно

D>у GridViewRow есть сво-во DataItem, которое является DataRowView — оттуда и бери значение ключевого поля


Вот что у меня работает на OnButtonClick

foreach (GridViewRow row in GridView1.Rows)
        {
            DataRowView rowView = (DataRowView)row.DataItem; 
            int Permitted = rowView["Permitted"];

            ...

        }


Ну так вот, row.DataItem у меня почему-то null.
Re[6]: Перебор данных по строкам GridView
От: Dronopotamus Россия  
Дата: 27.07.06 13:38
Оценка:
Здравствуйте, Махмуд, Вы писали:

М>Ну так вот, row.DataItem у меня почему-то null.


ну вопервых GridViewRow бывают разные, нам нужны только те, у которых
e.Row.RowType == DataControlRowType.DataRow;

во вторых тут есть бага сам тока нашел
читаем мcдн, св-во GridViewRow.DataItem

Use the DataItem property to access the properties of the underlying data object to which the GridViewRow object is bound. The DataItem property is only available during and after the RowDataBound event of a GridView control.

смотрим код рефлетором
метод GridView.CreateRow
if (dataBind)
{
            row1.DataBind();
            this.OnRowDataBound(args1);
            row1.DataItem = null;
}


... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Удар судьбы в лоб означает, что не возымели действия ее пинки под зад
Re: Перебор данных по строкам GridView
От: Аноним  
Дата: 07.11.06 16:32
Оценка:
наверное поздновато, но... как вариант
это можно сделать путем добавления ItemTemplate в шаблон поля
( а не только EditItemTemplate )
<asp:TemplateField>
<ItemTemplate>
<asp:CheckBox ID="chkBox" runat="server" />
</ItemTemplate>
<EditItemTemplate>
<asp:CheckBox ID="chkBox" runat="server" />
</EditItemTemplate>
</asp:TemplateField>
доступ к значению CheckBox`а всегда можно получить так:
 foreach (GridViewRow r in GridView1.Rows)
 {
   ... ((CheckBox)r.FindControl("chkBox")).Checked ...
 }


можно добавить CheckBox`у свойства CommnadName и CommandArgument.
сохранять можно все изменения сразу или по какому-нибудь событию.
m@xx [cc]


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.