0

Telerik の rad グリッドが 2 つあります。1 つ目はマスターで、2 つ目はディテールです。各グリッドの上にあるツールバーの「削除」ボタンを押すと、両方のグリッドから行を個別に削除できます。また、両方のグリッドのツールバーに「更新」ボタンがあります。

問題は詳細グリッドにあります。アイテムを削除すると、グリッドが更新されません。Rebind メソッドを呼び出しても役に立ちません。役立つ唯一のことは、マスター グリッドのツールバーの [更新] ボタンを押して、以前に選択したマウスでマスター グリッドの行を選択することです。その後、更新された詳細グリッドが表示されます。

そのため、マスター グリッドのツールバーの [更新] ボタンを押して、マスター グリッドの行をマウスで選択する必要はありません。プログラムでマスター グリッドを更新できますが、プログラムで最初に選択された項目のみを再選択したいと考えています。私はこれを試しました:

item.Selected = true;

ただし、マスター グリッドのアイテムを視覚的に選択するだけで、詳細グリッドは更新されません。

では、マウスで選択したのと同じ効果を得るために、プログラムでマスター グリッドのアイテムを選択する方法は?

前もって感謝します。

4

1 に答える 1

0

おそらく両方のグリッドに異なる DataSource を使用していることに気付きましたが、同じデータベースを指していますよね? 以下の例では、両方のグリッドに同じデータソースを使用しています。ただし、一部の列を非表示にすることで、詳細ビューと通常ビューを比較しました。この戦略で問題を解決できるのではないでしょうか?

私が最初に考えたのは、SelectionChanged イベントを実装するか、そうでない場合は SelectionChanging イベントを実装することでした。そこにリフレッシュを入れてください。しかし、私はそのようにすることにはなりませんでした。

以下のような小さなプログラムを書きました。削除ではない限り、行の変更とともに編集をディスクに保存します(ボタンをクリックすると、削除コマンドでnullポインタ例外が発生し、編集の削除を保存するのに問題がありました)。また、プログラムを閉じる直前に変更を保存します (削除された行も保存されるように)。deleteOne ボタンと deleteTwo ボタン (それぞれ 1 番目または 2 番目のグリッドから削除する) を使用すると、実際には両方のグリッドで削除が行われることがわかりました。あなたの状況で動作する場合、radGridView1.Rows.Remove(row) または RemoveAt(i) コマンドを使用できる可能性はありますか?

もう 1 つの可能性は、更新が機能しない場合、DataSource を null に設定し、行を削除した後にデータ ソースに再度設定することです。これは少し抜本的ですが、それが機能する唯一のものである場合はどうなりますか? 両方のグリッドのデータ ソースについて話しています。

私のコードは以下の通りです:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Telerik.WinControls;
using Telerik.WinControls.Data;
using Telerik.WinControls.UI;

namespace RadControlsWinFormsApp1
{
public partial class RadForm1 : Telerik.WinControls.UI.RadForm
{
    public RadForm1()
    {
        InitializeComponent();
    }

    private void RadForm1_Load(object sender, EventArgs e)
    {
        // TODO: This line of code loads data into the 'testdbDataSet.Customers' table. You can move, or remove it, as needed.
        this.customersTableAdapter.Fill(this.testdbDataSet.Customers);
        radGridView1.Columns["Address"].IsVisible = false;
    }

    private void radGridView1_RowsChanged(object sender, Telerik.WinControls.UI.GridViewCollectionChangedEventArgs e)
    {
        // if removing don't update, because if my delete button is pressed this
        // will otherwise cause all sorts of problems and freezes the grid
        if (e.Action != NotifyCollectionChangedAction.Remove)
        {
            try
            {
                customersTableAdapter.Update(testdbDataSet);
            }
            catch (DBConcurrencyException ex)
            {
                // unable to save right now, don't worry about it
            }
        }
        radGridView2.Refresh();
    }

    private void butDeleteOne_Click(object sender, EventArgs e)
    {
        bool haveRemoved = false;
        for (int i = 0; i < radGridView1.Rows.Count && !haveRemoved; ++i)
        {
            GridViewRowInfo row = radGridView1.Rows[i];
            if (row.IsSelected)
            {
                haveRemoved = true;
                radGridView1.Rows.RemoveAt(i);
            }
        }
    }
    private void butDeleteTwo_Click(object sender, EventArgs e)
    {
        bool haveRemoved = false;
        for (int i = 0; i < radGridView2.Rows.Count && !haveRemoved; ++i)
        {
            GridViewRowInfo row = radGridView2.Rows[i];
            if (row.IsSelected)
            {
                haveRemoved = true;
                radGridView2.Rows.RemoveAt(i);
            }
        }
    }

    private void radGridView2_RowsChanged(object sender, GridViewCollectionChangedEventArgs e)
    {
        // if removing don't update, because if my delete button is pressed this
        // will otherwise cause all sorts of problems and freezes the grid
        if (e.Action != NotifyCollectionChangedAction.Remove)
        {
            try
            {
                customersTableAdapter.Update(testdbDataSet);
            }
            catch (DBConcurrencyException ex)
            {
                // unable to save right now, don't worry about it
            }
        }
        radGridView1.Refresh();
    }

    private void RadForm1_FormClosing(object sender, FormClosingEventArgs e)
    {
        // ensure all data is saved back into database on close
        customersTableAdapter.Update(testdbDataSet);
    }
    //private void radGridView1_CellEndEdit(object sender, Telerik.WinControls.UI.GridViewCellEventArgs e)
    //{
    //}
}
}
于 2012-07-18T07:39:55.813 に答える