1

PostgreSQL ビューを使用して、次の形式でデータを表示しますDataGridView

dataSource = new BindingSource();
dataSource.DataSource = Program.DB.GetView(dbView);  // returns a DataTable
dgData.DataSource = dataSource;

Rows.Add()ここで、PostgreSQL 関数を使用してレコードを追加した後、グリッド内のデータを更新します (次の呼び出しは行いませんDataGridView:

protected void RefreshData() {
    dataSource.DataSource = Program.DB.GetView(dbView);
}

PostgreSQLの挿入機能は、挿入された行のIDを返すので、ID(主キーとなる)がわかっていSelectedtrueDataGridView. ビューは ID ではなく名前でソートされるため、行はセット内のどこにでも配置できます。すべての行を循環させてSelected見つけたときに設定することでそれを行うことができると思いますが、これは大規模なデータセットでは遅くなる可能性があります。

データソースの行をデータグリッドにバインドする方法はありますか?

4

1 に答える 1

1

イベントハンドラーをイベントに追加しListChangedます。

dataSource.ListChanged += dataSource_ListChanged;

イベントハンドラの定義は次のとおりです。

void dataSource_ListChanged(object sender, ListChangedEventArgs e)
{
    if (dgData.Rows.Count > 0)
        dgData.CurrentCell = dgData.Rows[e.NewIndex].Cells[0];
}

[アップデート]

コメントでも示唆したように、挿入(または更新)ごとにデータソースを再入力するべきではないかもしれません。私の主張を示すために、、2、2DataGridView秒(挿入と更新用)とを使用するコードサンプルを投稿します。SQLテーブルには2つの列(および)があります。TextBoxesButtonSqlDataAdapteridvalue

コードは次のとおりです(削除については説明しませんでした)。

public partial class Form1 : Form
{
    static BindingSource dataSource;
    static string dbView = "default";

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        dgData.MultiSelect = false;
        dataSource = new BindingSource();
        dataSource.ListChanged += dataSource_ListChanged;
        RefreshData();
        dgData.DataSource = dataSource;
        dgData.Sort(dgData.Columns[1], ListSortDirection.Ascending);
    }

    void dataSource_ListChanged(object sender, ListChangedEventArgs e)
    {
        if (dgData.Rows.Count > 0)
            dgData.CurrentCell = dgData.Rows[e.NewIndex].Cells[0];
    }

    protected void RefreshData()
    {
        dataSource.DataSource = DB.GetView(dbView);
    }

    private void insert_Click(object sender, EventArgs e)
    {
        DB.Insert(textBox1.Text);
        RefreshData();
    }

    private void update_Click(object sender, EventArgs e)
    {
        DB.UpdateRandomRow(textBox2.Text);
        RefreshData();
    }
}

class DB
{
    static DataTable dt;
    static string conStr = "yourConnectionString";
    static SqlDataAdapter _adapter;
    static Random r = new Random(10);

    public static SqlDataAdapter CreateSqlDataAdapter(SqlConnection connection)
    {
        _adapter = new SqlDataAdapter();
        _adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;

        _adapter.SelectCommand = new SqlCommand(
            "SELECT * FROM test", connection);
        _adapter.InsertCommand = new SqlCommand(
            "INSERT INTO test (value) " +
            "VALUES (@value)", connection);
        _adapter.UpdateCommand = new SqlCommand(
            "UPDATE test SET [value] = @value " +
            "WHERE id = @id", connection);
        _adapter.InsertCommand.Parameters.Add("@value",
            SqlDbType.NVarChar, 50, "value");
        _adapter.UpdateCommand.Parameters.Add("@id",
            SqlDbType.Int, 4, "id").SourceVersion = DataRowVersion.Current;
        _adapter.UpdateCommand.Parameters.Add("@value",
            SqlDbType.NVarChar, 50, "value").SourceVersion = DataRowVersion.Current;

        return _adapter;
    }

    // random update, to demonstrate dynamic
    // repositioning
    public static DataTable UpdateRandomRow(string value)
    {
        var currentRandom = r.Next(dt.Rows.Count);
        dt.Rows[currentRandom].SetField<string>(1, value);
        using (var con = new SqlConnection(conStr))
        {
            con.Open();
            _adapter = CreateSqlDataAdapter(con);
            _adapter.Update(dt);
        }
        return dt;
    }

    internal static DataTable GetView(string dbView)
    {
        if (dt == null)
        {
            dt = new DataTable();
            using (var con = new SqlConnection(conStr))
            {
                con.Open();
                _adapter = CreateSqlDataAdapter(con);
                _adapter.Fill(dt);
            }
        }
        return dt;
    }

    internal static void Insert(string value)
    {
        if (dt == null)
            GetView("");
        var dr = dt.NewRow();
        dr[1] = value;
        dt.Rows.Add(dr);
        using (var con = new SqlConnection(conStr))
        {
            con.Open();
            _adapter = CreateSqlDataAdapter(con);
            _adapter.Update(dt);
        }
    }
}

テストすると、質問からのリクエストが挿入と更新の両方で満たされていることがわかります。また、操作ごとにデータテーブルが再作成されないため、パフォーマンスが向上することに注意してください。

于 2013-03-01T09:26:36.030 に答える