Невозможно обновить DataGridView, который связан с DataTable - PullRequest
0 голосов
/ 12 апреля 2019

Я попробовал все, используя другие ответы на форуме. Я просто хочу, чтобы представление таблицы данных динамически обновлялось, когда я выбираю кнопку обновления в форме после внесения изменений.

Ссылаясь на приведенный ниже код, текущий результат заключается в том, что когда я добавляю новую строку и нажимаю кнопку обновления, представление сетки данных просто добавляет все существующие записи (и новую строку) внизу, так что список продолжает увеличиваться в размере с дублированием значения.

 public UserGroupsGridViewForm()
    {
        InitializeComponent();
    }

    private void UserGroupsGridViewForm_Load(object sender, EventArgs e)
    {
        LoadUserGroupsToDataTable();
    }

    public static SqlCommandBuilder userGroupsSqlCommandBuilder;
    public static DataTable userGroupsDataTable = new DataTable();
    public static SqlDataAdapter userGroupsSqlAdaptor;

    public void LoadUserGroupsToDataTable()
    {
        try
        {
            SqlConnection connection = new SqlConnection(connectionString);
            string cmdText1 = "SELECT * FROM [dbo].[UserGroups]";
            userGroupsSqlAdaptor = new SqlDataAdapter(cmdText1, connection);
            userGroupsSqlCommandBuilder = new SqlCommandBuilder(userGroupsSqlAdaptor);
            userGroupsSqlAdaptor.Fill(userGroupsDataTable);
        }
        catch (Exception ex)
        {
            log.Error(ex);
            SystemEvents.DatabaseExceptions(ex);
        }
        LoadDataTabletoGridView();
    }

    private void LoadDataTabletoGridView()
    {
        try
        {
            UserGroupsGridView1.DataSource = userGroupsDataTable;
        }
        catch (Exception ex)
        {
            SystemEvents.DatabaseExceptions(ex);
        }
    }

    private void SaveChangesButton_Click(object sender, EventArgs e)
    {
        userGroupsSqlAdaptor.Update(userGroupsDataTable);
        //UserGroupsGridView1.Update(); // not working!
        //UserGroupsGridView1.Refresh(); // not working!
        LoadUserGroupsToDataTable();
    }

1 Ответ

0 голосов
/ 12 апреля 2019

ОК, так что я нашел довольно новый пример от Microsoft, который решил мой запрос. Официальное руководство можно найти здесь:

Единственное реальное изменение, которое я сделал на примере Microsoft, заключалось в том, чтобы объединить два метода обновления и перезагрузки (с помощью одной кнопки Сохранить) в моей форме, чтобы изменения были отражены немедленно.

 private void UserGroupsGridViewForm_Load(object sender, EventArgs e)
    {
        LoadDataTabletoGridView();
    }

    private readonly BindingSource bindingSource1 = new BindingSource();
    private SqlDataAdapter dataAdapter = new SqlDataAdapter();

    public void GetData(string selectCommand)
    {
        try
        {
            SqlConnection connection = new SqlConnection(connectionString);
            //string cmdText1 = "SELECT * FROM [dbo].[UserGroups]";

            // Create a new data adapter based on the specified query.
            dataAdapter = new SqlDataAdapter(selectCommand, connection);

            // Create a command builder to generate SQL update, insert, and
            // delete commands based on selectCommand. 
            SqlCommandBuilder commandBuilder = new SqlCommandBuilder(dataAdapter);

            // Populate a new data table and bind it to the BindingSource.
            DataTable table = new DataTable
            {
                Locale = CultureInfo.InvariantCulture
            };
            dataAdapter.Fill(table);
            bindingSource1.DataSource = table;
        }
        catch (Exception ex)
        {
            log.Error(ex);
            SystemEvents.DatabaseExceptions(ex);
        }
    }

    private void LoadDataTabletoGridView()
    {
        // Bind the DataGridView to the BindingSource
        // and load the data from the database.
        UserGroupsGridView.DataSource = bindingSource1;
        GetData("SELECT * FROM [dbo].[UserGroups]");
    }

    private void SaveChangesButton_Click(object sender, EventArgs e)
    {
        // Update the database with changes.
        dataAdapter.Update((DataTable)bindingSource1.DataSource);

        // Reload the data from the database.
        GetData(dataAdapter.SelectCommand.CommandText);
    }
...