2

ASPX:

<telerik:RadGrid ID="ctlItemsGrid" runat="server" DataKeyNames="Id" AllowPaging="true" AllowSorting="true" GridLines="None" Skin="Windows7" EnableViewState="true">
    <MasterTableView AutoGenerateColumns="false" AllowPaging="true" DataKeyNames="Id,WorkflowStatus" NoMasterRecordsText="No items exist in the database." EnableViewState="true">
        <SortExpressions>
            <telerik:GridSortExpression FieldName="Id" SortOrder="Descending" />
        </SortExpressions>
        <PagerStyle Mode="NextPrevAndNumeric" />
        <Columns>            
            <telerik:GridNumericColumn ColumnEditorID="ctlColumnId" HeaderText="ID" DataField="Id" DecimalDigits="0" DataType="System.Int32" NumericType="Number" ReadOnly="true"></telerik:GridNumericColumn>
            <telerik:GridDropDownColumn UniqueName="ctlColumnGridWorkflow" ColumnEditorID="ctlColumnWorkflow" HeaderText="Workflow" DataField="WorkflowStatus" DropDownControlType="DropDownList"></telerik:GridDropDownColumn>
            <telerik:GridEditCommandColumn UniqueName="ctlColumnGridEdit" CancelText="Cancel" EditText="Edit"></telerik:GridEditCommandColumn>
            <telerik:GridButtonColumn UniqueName="ctlColumnGridDelete" CommandName="Delete" CommandArgument="" Text="Remove"></telerik:GridButtonColumn>
        </Columns>
    </MasterTableView>
</telerik:RadGrid>

C#:

public partial class administration_modules_item_Default : ViewPageBase<IItemAdminPresenter, IItemAdminView>, IItemAdminView
{
    private IEnumerable<WorkflowStatus> _workflowStatuses;
    private IEnumerable<IItemDbItem> _items;

    protected override void PreloadView()
    {
        this.ctlItemsGrid.ItemDataBound += new Telerik.Web.UI.GridItemEventHandler(ctlItemsGrid_ItemDataBound);
        this.ctlItemsGrid.ItemCommand += new GridCommandEventHandler(ctlItemsGrid_ItemCommand);
        //this.ctlItemsGrid.ItemUpdated += new GridUpdatedEventHandler(ctlItemsGrid_ItemUpdated);
        this.ctlItemsGrid.UpdateCommand += new GridCommandEventHandler(ctlItemsGrid_UpdateCommand);
    }

    protected override void PostLoadView()
    {
        // Doesn't work, values are all empty strings
        //foreach (GridEditableItem editItem in ctlItemsGrid.EditItems)
        //{
        //    Dictionary<string, string> newValues = new Dictionary<string, string>();
        //    ctlItemsGrid.MasterTableView.ExtractValuesFromItem(newValues, editItem);
        //    IItemDbItem w = (IItemDbItem)editItem.DataItem;
        //    if (!string.IsNullOrWhiteSpace(newValues["WorkflowStatus"]))
        //    {
        //        w.WorkflowStatus = (WorkflowStatus)Enum.Parse(typeof(WorkflowStatus), newValues["WorkflowStatus"]);
        //        this.Presenter.Update(w.Id, w.WorkflowStatus);
        //    }
        //}

        ctlItemsGrid.DataSource = _items;
        ctlItemsGrid.DataBind();

        base.PostLoadView();
    }

    void ctlItemsGrid_ItemDataBound(object sender, Telerik.Web.UI.GridItemEventArgs e)
    {
        if (e.Item is GridEditableItem && (e.Item as GridEditableItem).IsInEditMode)
        {
            GridEditableItem editedItem = e.Item as GridEditableItem;
            GridEditManager editMan = editedItem.EditManager;
            IItemDbItem w = (IItemDbItem)e.Item.DataItem;

            // This doesn't work either, values are all null or empty:
            //if (editedItem.CanExtractValues)
            //{
            //    Dictionary<string, string> newValues = new Dictionary<string,string>();
            //    editedItem.ExtractValues(newValues);
            //    if (newValues["WorkflowStatus"] != null)
            //    {
            //        w.WorkflowStatus = (WorkflowStatus)Enum.Parse(typeof(WorkflowStatus), newValues["WorkflowStatus"]);
            //        this.Presenter.Update(w.Id, w.WorkflowStatus);
            //    }
            //}

            GridDropDownListColumnEditor ctlColumnWorkflow = editMan.GetColumnEditor("ctlColumnGridWorkflow") as GridDropDownListColumnEditor;
            ctlColumnWorkflow.DataSource = _workflowStatuses;
            ctlColumnWorkflow.DataBind();
            ctlColumnWorkflow.SelectedValue = w.WorkflowStatus.ToString();

        }
        else if (e.Item is GridDataItem)
        {
            GridDataItem dataItem = e.Item as GridDataItem;

            IItemDbItem w = (IItemDbItem)e.Item.DataItem;

            dataItem["ctlColumnGridWorkflow"].Text = w.WorkflowStatus.ToString();
        }
    }

    void ctlItemsGrid_ItemCommand(object sender, GridCommandEventArgs e)
    {
        string cmdName = e.CommandName;
        IItemDbItem w = (IItemDbItem)e.Item.DataItem;

        switch (cmdName)
        {
            case "Delete":
                this.Presenter.Delete(w.Id);
                this.Presenter.LoadView();
                break;
            case "Update":
                // This doesn't work either: 
                //GridEditableItem editedItem = e.Item as GridEditableItem;
                //GridEditManager editMan = editedItem.EditManager;
                //DropDownList editWorkflow = (DropDownList)editedItem["ctlColumnGridWorkflow"].Controls[0];
                //DropDownList editEvent = (DropDownList)editedItem["ctlColumnGridEvent"].Controls[0];
                //this.Presenter.Update(w.Id, (WorkflowStatus)Enum.Parse(typeof(WorkflowStatus));
                break;
        }

        //this.Presenter.LoadView();
    }

    // Doesn't work: 
    //void ctlItemsGrid_ItemUpdated(object sender, GridUpdatedEventArgs e)
    //{
    //    GridEditableItem editedItem = e.Item as GridEditableItem;
    //    GridEditManager editMan = editedItem.EditManager;
    //    DropDownList editWorkflow = editedItem["ctlColumnGridWorkflow"].Controls[0] as DropDownList;
    //    IItemDbItem w = (IItemDbItem)e.Item.DataItem;
    //    this.Presenter.Update(w.Id, (WorkflowStatus)Enum.Parse(typeof(WorkflowStatus), editWorkflow.SelectedValue));
    //}

    // Doesn't work: 
    void ctlItemsGrid_UpdateCommand(object sender, GridCommandEventArgs e)
    {
        GridEditableItem editedItem = e.Item as GridEditableItem;
        GridEditManager editMan = editedItem.EditManager;
        DropDownList editWorkflow = editedItem["ctlColumnGridWorkflow"].Controls[0] as DropDownList;
        IItemDbItem w = (IItemDbItem)e.Item.DataItem;

        this.Presenter.Update(w.Id, (WorkflowStatus)Enum.Parse(typeof(WorkflowStatus), editWorkflow.SelectedValue));
    }

    public IEnumerable<WorkflowStatus> WorkflowStatuses
    {
        set
        {
            _workflowStatuses = value;
        }
    }

    public IEnumerable<IItemDbItem> Items
    {
        get
        {
            return _items;
        }
        set
        {
            _items = value;
        }
    }

}

アイテムを追加するための別のフォーム(表示されていません)があり、正常に機能します。また、削除ボタンも正常に機能します。保存された項目を更新しようとすると、GridDropDownColumn から取得できるすべての値は、編集された値ではなく、null、空、または既定値のいずれかになります。Visual Studio のイミディエイト ウィンドウでステップ実行してテストすると、次のばかげたステートメントを使用して正しい値を見つけることができました。

((DropDownList)ctlItemsGrid.MasterTableView.GetItems(GridItemType.EditFormItem)[0].Controls[1].Controls[0].Controls[0].Controls[1].Controls[0].Controls[0].Controls[1].Controls[1].Controls[0]).SelectedValue

しかし、もっと簡単な方法があるはずです。私は何を間違っていますか?

4

2 に答える 2

1

最初の実装がうまくいかなかったのは奇妙です - 私は自分の側で簡単なサンプル プロジェクトを作成し、e.Item.DataItem からすべての情報を取得することができました (後で DropDownList にバインドするため、Id 列だけではありますが)。 .

これを ItemDataBound イベントから取得するための厳密な要件はありますか? より適切なイベントは UpdateCommand です。いくつかの簡単なコードを使用して、アイテムを簡単に取得できます。

protected void ctlItemsGrid_UpdateCommand(object sender, GridCommandEventArgs e)
{
    if (e.Item is GridEditableItem && e.Item.IsInEditMode)
    {
        GridEditableItem item = e.Item as GridEditableItem;
        string Employee = (item["ctlColumnGridWorkflow"].Controls[0] as DropDownList).SelectedItem.Text;
    }
}

次に、このドキュメントの記事で説明されている手法を使用して、目的の値を抽出できます。

それでも最初の試みのようにアプローチしたい場合は、何が起こっているのかを正確に確認するために、スタンドアロンのサンプル プロジェクトが必要になる場合があります。

于 2013-01-10T01:13:31.597 に答える
0

これがそれを修正する正しい方法であったかどうかはわかりませんが、これは私にとってはうまくいきます:

public partial class administration_modules_item_Default : ViewPageBase<IItemAdminPresenter, IItemAdminView>, IItemAdminView
{
    private IEnumerable<WorkflowStatus> _workflowStatuses;
    private IEnumerable<IItemDbItem> _items;

    protected override void PreloadView()
    {
        this.ctlItemsGrid.ItemDataBound += new Telerik.Web.UI.GridItemEventHandler(ctlItemsGrid_ItemDataBound);
        this.ctlItemsGrid.ItemCommand += new GridCommandEventHandler(ctlItemsGrid_ItemCommand);
        this.ctlItemsGrid.NeedDataSource += new GridNeedDataSourceEventHandler(ctlItemsGrid_NeedDataSource);
    }

    void ctlItemsGrid_NeedDataSource(object sender, GridNeedDataSourceEventArgs e)
    {
        ctlItemsGrid.DataSource = _items;
    }

    protected override void PostLoadView()
    {
        if (!IsPostBack)
        {
            ctlItemWorkflow.DataSource = _workflowStatuses;
            ctlItemWorkflow.DataBind();
        }

        base.PostLoadView();
    }

    protected override void OnLoadComplete(EventArgs e)
    {
        base.OnLoadComplete(e);
        ctlItemsGrid.Rebind();
    }

    void ctlItemsGrid_ItemDataBound(object sender, Telerik.Web.UI.GridItemEventArgs e)
    {
        if (e.Item is GridEditableItem && (e.Item as GridEditableItem).IsInEditMode)
        {
            GridEditableItem editedItem = e.Item as GridEditableItem;
            GridEditManager editMan = editedItem.EditManager;
            IItemDbItem w = (IItemDbItem)e.Item.DataItem;

            GridDropDownListColumnEditor ctlColumnWorkflow = editMan.GetColumnEditor("ctlColumnGridWorkflow") as GridDropDownListColumnEditor;
            ctlColumnWorkflow.DataSource = _workflowStatuses;
            ctlColumnWorkflow.DataBind();
            ctlColumnWorkflow.SelectedValue = w.WorkflowStatus.ToString();
        }
        else if (e.Item is GridDataItem)
        {
            GridDataItem dataItem = e.Item as GridDataItem;

            IItemDbItem w = (IItemDbItem)e.Item.DataItem;

            dataItem["ctlColumnGridWorkflow"].Text = w.WorkflowStatus.ToString();
        }
    }

    void ctlItemsGrid_ItemCommand(object sender, GridCommandEventArgs e)
    {
        string cmdName = e.CommandName;
        IItemDbItem w = (IItemDbItem)e.Item.DataItem;

        switch (cmdName)
        {
            case "Delete":
                GridDataItem item = e.Item as GridDataItem;
                int id = Convert.ToInt32(item.GetDataKeyValue("Id"));
                this.Presenter.Delete(id);
                this.Presenter.LoadView();
                break;
            case "Update":
                GridEditableItem editedItem = e.Item as GridEditableItem;
                GridEditManager editMan = editedItem.EditManager;
                DropDownList editWorkflow = (DropDownList)editedItem["ctlColumnGridWorkflow"].Controls[0];

                int wid = Convert.ToInt32(editedItem.GetDataKeyValue("Id"));

                this.Presenter.Update(wid, (WorkflowStatus)Enum.Parse(typeof(WorkflowStatus), editWorkflow.SelectedValue));
                this.Presenter.LoadView();
                break;
        }
    }

    public IEnumerable<WorkflowStatus> WorkflowStatuses
    {
        set
        {
            _workflowStatuses = value;
        }
    }

    public IEnumerable<IItemDbItem> Items
    {
        get
        {
            return _items;
        }
        set
        {
            _items = value;
        }
    }

}

とを使用するNeedDataSourceと、期待どおりに機能を開始Rebindできるように見えました。ItemCommand

于 2013-01-09T23:34:55.247 に答える