0

編集および挿入モードとフィルター機能を備えた RadGrid を実装しました。

編集モードで RadGrid をフィルタリングすると、編集された行は行番号に基づいているように見えます。たとえば、行番号 3 を編集していて、編集中にグリッドがフィルタリングされ、編集された行が行番号 3 のままになる現在編集中のレコードの行は変更されている可能性があります。

たとえば、このテーブルでインプレース編集を使用して自動 CRUD を実行している場合

(ID) (コード)
-----------------------
(01)コードエックス
(02)コードY
(03)コードY

編集中の行は 2 行目 ((02) codeY)

結果が

(ID) (コード)
-----------------------
(02)コードY
(03)コードY

最初に編集された行は ((02) codeY) ですが、編集された行はまだ 2 番目の行 ((03) codeY) です。

これは予想される動作ですか、それとも RadGrid にレコードを探してその特定のレコードで編集モードを再度設定するように指示する方法はありますか? そうでない場合、フィルタリングの直前に編集モード/挿入モードを自動的にキャンセルする方法はありますか? または、ユーザーが編集/挿入モードのときにすべてのフィルタリング コントロールを無効にするには? 読んでくれてありがとう。

4

1 に答える 1

1

以下のコード スニペットを試してみてください。

ASPX

<telerik:RadGrid ID="RadGrid1" runat="server" AutoGenerateColumns="False" OnNeedDataSource="RadGrid1_NeedDataSource"
    AllowFilteringByColumn="true" OnItemCommand="RadGrid1_ItemCommand" OnPreRender="RadGrid1_PreRender">
    <MasterTableView EditMode="InPlace" DataKeyNames="ID" CommandItemDisplay="Top">
        <Columns>
            <telerik:GridBoundColumn DataField="ID" UniqueName="ID" HeaderText="ID">
            </telerik:GridBoundColumn>
            <telerik:GridBoundColumn DataField="Name" UniqueName="Name" HeaderText="Name">
            </telerik:GridBoundColumn>
            <telerik:GridEditCommandColumn>
            </telerik:GridEditCommandColumn>
        </Columns>
    </MasterTableView>
</telerik:RadGrid>

ASPX.CS

public List<int> EditIDs
{
    get
    {
        if (ViewState["EditID"] != null)
        {
            return (List<int>)ViewState["EditID"];
        }
        else
        {
            return new List<int>();
        }
    }
    set { ViewState["EditID"] = value; }
}

public bool IsFilterCommandFire { get; set; }

protected void Page_Init(object sender, EventArgs e)
{

}
protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        EditIDs = new List<int>();
    }
}
protected void Page_PreRender(object sender, EventArgs e)
{

}
protected void RadGrid1_NeedDataSource(object sender, GridNeedDataSourceEventArgs e)
{
    dynamic data = new[] {
        new { ID = 1, Name ="Name1"},
        new { ID = 2, Name = "Name2"},
        new { ID = 3, Name = "Name3"},
         new { ID = 4, Name = "Name4"},
        new { ID = 5, Name = "Name5"},
        new { ID = 26, Name = "Name26"}
    };

    RadGrid1.DataSource = data;

}
protected void RadGrid1_ItemCommand(object sender, GridCommandEventArgs e)
{
    if (e.CommandName == RadGrid.FilterCommandName)
    {
        IsFilterCommandFire = true;
    }
    else if (e.CommandName == RadGrid.EditCommandName)
    {
        int ID = Convert.ToInt32((e.Item as GridEditableItem).GetDataKeyValue("ID"));
        EditIDs.Add(ID);
    }
    else if (e.CommandName == RadGrid.CancelCommandName)
    {
        int ID = Convert.ToInt32((e.Item as GridEditableItem).GetDataKeyValue("ID"));
        EditIDs.Remove(ID);
    }
}
protected void RadGrid1_PreRender(object sender, EventArgs e)
{
    if (IsFilterCommandFire)
    {
        foreach (GridDataItem item in RadGrid1.Items)
        {
            if (EditIDs.Contains(Convert.ToInt32(item.GetDataKeyValue("ID"))))
            {
                item.Edit = true;
            }
            else
            {
                item.Edit = false;
            }
        }
        RadGrid1.Rebind();
    }
}

気になることがあれば教えてください。

于 2013-06-07T13:07:47.657 に答える