Telerik RadGrid с различными типами элементов управления редактированием

Мне нужно отобразить список полей. Некоторые редактируются, а некоторые нет. Те, которые есть, могут быть разных типов, например, текстовые поля, даты, время или логические значения. Я использую RadGrid от Telerik. См. снимок экрана для тестового проекта, который я сделал.

Вопросы: Почему в обработчике созданного элемента 4 ячейки? Мне пришлось заполнить ячейки [2] и ячейки [3] для отображения значений. Я установил для AutoGenerateColumns значение false, и у меня есть только два определения GridTemplateColumn.

Почему item.RowIndex увеличивается на два и достигает двадцати? Когда у меня есть 10 строк.

Есть лучший способ сделать это?

Вот как я объявил сетку:

        <telerik:RadGrid runat="server" ID="Grid1" Width="100%" Height="500px" GridLines="None" AutoGenerateColumns="false"
        OnItemCreated="OnGridItemCreated"
        OnNeedDataSource="OnGridNeedDataSource">
        <ItemStyle Wrap="true" />
        <AlternatingItemStyle Wrap="true" />
        <ClientSettings>                    
            <Selecting AllowRowSelect="false" />
            <Scrolling AllowScroll="true" UseStaticHeaders="true" />
            <Resizing AllowColumnResize="true" ClipCellContentOnResize="true" ResizeGridOnColumnResize="true" EnableRealTimeResize="true" />
        </ClientSettings>
        <MasterTableView>
            <NoRecordsTemplate>
                <asp:Label ID="lblNorec1" runat="server" Text="No records"></asp:Label>
            </NoRecordsTemplate>
            <Columns>
                <telerik:GridTemplateColumn UniqueName="FieldDisplayName" HeaderText="Field Name">
                    <ItemTemplate>
                    </ItemTemplate>
                </telerik:GridTemplateColumn>
                <telerik:GridTemplateColumn UniqueName="FieldValue" HeaderText="Value">
                    <ItemTemplate>
                    </ItemTemplate>
                </telerik:GridTemplateColumn>
            </Columns>
        </MasterTableView>
    </telerik:RadGrid>

/

/ grid needs datasource
    protected void OnGridNeedDataSource(object source, GridNeedDataSourceEventArgs e)
    {
        // create a DataSource
        DataSet ds = new DataSet();
        DataTable dt = new DataTable();
        dt.Columns.Add(new DataColumn("Field_Display_Name"));
        dt.Columns.Add(new DataColumn("Field_Value"));

    for (int i = 0; i < 10; ++i)
    {
        DataRow dr = dt.NewRow();
        dr["Field_Display_Name"] = "Item Id" + i.ToString();
        dr["Field_Value"] = "Value" + i.ToString();
        dt.Rows.Add(dr);
    }

    ds.Tables.Add(dt);
    Grid1.DataSource = ds;
}

// grid item is created
protected void OnGridItemCreated(object sender, GridItemEventArgs e)
{
    if (e.Item is GridDataItem)
    {
        GridDataItem item = (GridDataItem)e.Item;

       // fill in cells 2 and 3. Why are there 4?

        Label lbl = new Label();
        lbl.Text = "Field " +  item.RowIndex;
        item.Cells[2].Controls.Add(lbl);

        switch (item.RowIndex)
        {
            case 2:
            case 8:
                RadTextBox txt = new RadTextBox();
                txt.ID = "RadTextBox1";
                txt.Text = "hello " + item.RowIndex;
                item.Cells[3].Controls.Add(txt);
                break;
            case 4:
            case 10:
                RadDatePicker dp = new RadDatePicker();
                dp.ID = "RadDatePicker1";
                dp.SelectedDate = DateTime.Now;
                item.Cells[3].Controls.Add(dp);
                break;
            case 6:
            case 12:
                CheckBox cb = new CheckBox();
                item.Cells[3].Controls.Add(cb);
                break;
            default:
                Label lbl2 = new Label();
                lbl2.Text = "Value " +  item.RowIndex;
                item.Cells[3].Controls.Add(lbl2);
                break;
        }
    }
}

альтернативный текст


person BrianK    schedule 16.08.2010    source источник
comment
Я переключился на событие OnItemDataBound и использовал ItemIndex вместо RowIndex. Это дает мне значение индекса от 0 до 9. Очевидно, столбцы 0 и 1 всегда создаются для элементов команды. Вместо того, чтобы ссылаться на индекс, я изменил имя столбца на уникальное. // устанавливаем текст в первую колонку item[FieldDisplayName].Text = Field + index; // добавить элемент во второй столбец RadTextBox txt = new RadTextBox(); txt.ID = RadTextBox1; txt.Text = привет + индекс; элемент[FieldValue].Controls.Add(txt);   -  person BrianK    schedule 17.08.2010


Ответы (1)


Если сетка отражает ваши фактические потребности, я бы посоветовал вам использовать HTML-таблицу внутри ASP FormView. Вы можете отобразить большую часть того, что вы здесь показали, прямо в HTML. Существует множество учебных пособий по FormView, это похоже на решение того, что вам нужно. Не позволяйте сложности попытки втиснуть этот материал в radgrid заставить вас двигаться в неправильном направлении.

Если вы хотите показать, скажем, 10 записей за раз, вот где пригодится gridview/radgrid, если это только одна запись за раз, посмотрите на formview.

РЕДАКТИРОВАТЬ: я только что заметил, что это было задано год назад. Надеюсь, вы еще не ждете ответа на этот вопрос!

person abend    schedule 07.07.2011