Показывать сразу данные в datagridview после вставки / обновления - PullRequest
0 голосов
/ 10 февраля 2019

Я знаю, что это много раз задавалось здесь, в SOF, но, уверяю вас, я пробовал все, например .refresh, .update, вызывал метод после вставки и т. Д., Но ничего не произошло, мне нужно снова обновить свой пользовательский элемент управления, чтобы увидетьновое изменение данных в datagridview.Я использую хранимую процедуру для отображения данных в моем сетевом представлении, а также для вставки, обновления и т. Д. Я надеюсь, что кто-то сможет помочь мне определить, что я делаю неправильно или что я пропустил.Спасибо

Вот мой класс для отображения данных в моем datagridview

public static class Display 
{
    public static void Display_Customer(DataTable dt, DataGridView dgv)
    {     
        using (var con = new SqlConnection(ConfigurationManager.ConnectionStrings["SalesInventoryManagement.Properties.Settings.Setting"].ConnectionString))
        {
            using (var cmd = new SqlCommand("usp_GetCustomers", con))
            {               
                con.Open();
                cmd.CommandType = CommandType.StoredProcedure;
                using (var sda = new SqlDataAdapter(cmd))
                {
                    sda.Fill(dt);
                    var bsource = new BindingSource();
                    bsource.DataSource = dt;
                    dgv.DataSource = bsource;
                    sda.Update(dt);
                }
                con.Close();    
            }
        }
    } 
}

Вот мой usercontrol, где мои элементы управления, такие как datagridview, кнопка и т. Д.

 public partial class ManageCustomer : UserControl
{
    public ManageCustomer()
    {
        InitializeComponent();
    }
    public DataTable dt = new DataTable();
    private void ManageCustomer_Load(object sender, EventArgs e)
    {
        Display.Display_Customer(dt, CustomersList);   
        Customization._DGVWidth(CustomersList);
    }
    private void CustomersList_SelectionChanged(object sender, EventArgs e)
    {
        Register.CustomerSelection(CustomersList, lbl_id, lbl_name, lbl_gender, 
        lbl_contact,lbl_email, lbl_address, PreviewImage);      
    }
    private void Btn_Update_Click(object sender, EventArgs e)
    {
        var uc = new UpdateCustomer(this).ShowDialog();
    }
    private void CustomersList_RowEnter(object sender, DataGridViewCellEventArgs e)
    {
        if (e.RowIndex >= 0)
        {
            DataGridViewRow row = CustomersList.Rows[e.RowIndex];
            Variables.ID = row.Cells["Customer ID"].Value.ToString();
        }
    }

}

Вот форма, котораяполучить данные из сетки данных на основе идентификатора PS: Btn_Update показать новую форму для моего usercontrol

public partial class UpdateCustomer : Form
{
    ManageCustomer _view;
    public UpdateCustomer(ManageCustomer view)
    {
        InitializeComponent();
        UpdateC.CustomerInformation(Variables.ID, lbl_path, PreviewImage, txt_name, txt_contact, txt_email, txt_address);
        this._view = view;
    }
    private void btn_update_Click(object sender, EventArgs e)
    {
        using (var con = new SqlConnection(ConfigurationManager.ConnectionStrings["SalesInventoryManagement.Properties.Settings.Setting"].ConnectionString))
        {
            UpdateC._Update(lbl_path.Text, txt_name.Text, txt_contact.Text, txt_email.Text, txt_address.Text);
            Display.Display_Customer(_view.dt, _view.CustomersList);
        }
    }
}

Наконец, вот мой сохраненный процесс

USE [SalesInventory]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[usp_GetCustomers]

AS
BEGIN
SET NOCOUNT ON; 
                SELECT   CustomerID as 'Customer ID', Images, Full_Name, Gender, Contact_Number as 'Contact Number', Email, Home_Address as 'Address'
                FROM Customer_List      
END

1 Ответ

0 голосов
/ 11 февраля 2019

Я поиграл с кодом, который вы опубликовали, и мне удалось обновить GridView без перезагрузки.

Пожалуйста, измените класс отображения, как показано ниже

    public static void Display_Customer3(DataGridView dgv)
    {
        using (var con = new SqlConnection(ConfigurationManager.ConnectionStrings["SalesInventoryManagement.Properties.Settings.Setting"].ConnectionString))
        {
            using (var cmd = new SqlCommand("usp_GetCustomers", con))
            {
                con.Open();
                cmd.CommandType = CommandType.StoredProcedure;
                using (var sda = new SqlDataAdapter(cmd))
                {
                    DataTable dt = new DataTable();     // Initiate the datatable here to avoid getting duplicate data during 'sda.Fill(dt)'
                    sda.Fill(dt);
                    var bsource = new BindingSource();
                    bsource.DataSource = dt;
                    dgv.DataSource = bsource;
                    //sda.Update(dt);
                }
                con.Close();
            }
        }
    }

Обновите оставшуюся частькод, на который ссылается Display.Display_Customer соответственно.

Display.Display_Customer(CustomersList);

Или

Display.Display_Customer(_view.CustomersList);

После изменения вышеуказанного мне удалось обновить DataGridView после обновления.

Обновление для включения поиска в DataGridView:

Поскольку BindingSourse используется в качестве источника данных, вы можете использовать BindingSourse.Filter для включения поиска.Обновите текстовое поле поиска, как показано ниже;

BindingSource dgBS = (BindingSource)CustomersList.DataSource;
dgBS.Filter = string.Format("FileName LIKE '%{0}%'", txtFilter_FileName.Text);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...