【问题标题】:Refresh or show immediately in datagridview after inserting插入后立即在datagridview中刷新或显示
【发布时间】:2019-03-05 08:10:28
【问题描述】:

我知道它在 SOF 中被问过很多次,但我向你保证,我尝试了所有方法,如 .refresh、.update、插入后调用方法等,但仍然没有任何反应,我需要再次刷新我的用户控件才能看到datagridview 中的新数据更改。我在 Windows 窗体中实现 MVC 模式很新。在这些代码下面,我删除了一些我的代码,比如插入代码,因为这没有问题。我希望有人能够帮助我。

查看:

public partial class Update : Form
{
    private Customer _customer;
    public Update(Customer customer)
    {
        InitializeComponent();
        new UpdateController(this);
        _customer = customer;
        CustomPicturebox.Circle(PreviewImage);
        LoadCustomer();
    }
}

型号:

public class Customer
{

Connection Con = new Connection();
    private readonly string _date = DateTime.Now.ToString("dddd, dd MMMM yyyy");
    private readonly string _setDateId = DateTime.Now.ToString("yyyy");
    //Get the Customer Fields
    public DataTable DataTable = new DataTable();
    public DataView DataView = new DataView();

    public string _customerId { get; set; }
    public string _imagePath { get; set; }
    public string _firstName { get; set; }
    public string _middleName { get; set; }
    public string _lastName { get; set; }
    public string _extensionName { get; set; }
    public string _gender { get; set; }
    public string _contactNumber { get; set; }
    public string _email { get; set; }
    public string _homeAddress { get; set; }
    public string _searchCustomer { get; set; }

    public Customer()
    {
    }
    public Customer
    (
        string customerID,
        string imagePath,
        string firstName,
        string middleName,
        string lastName,
        string extensionName,
        string gender,
        string contactNumber,
        string email,
        string homeAddress
    )
    {
        _customerId     = customerID;
        _imagePath      = imagePath;
        _firstName      = firstName;
        _middleName     = middleName;
        _lastName       = lastName;
        _extensionName  = extensionName;
        _gender         = gender;
        _contactNumber  = contactNumber;
        _email          = email;
        _homeAddress    = homeAddress;
     }
    public void GetID(string customerID)
    {
        using (var cmd = new SqlCommand("usp_GetCustomerID", Con.GetConnection()))
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue("@customerID", customerID);
            using (var reader = cmd.ExecuteReader())
            {
                if (reader.Read())
                {
                    _customerId    = reader["CustomerID"].ToString();
                    _imagePath     = reader["ImagePath"].ToString();
                    _firstName     = reader["FirstName"].ToString();
                    _middleName    = reader["MiddleName"].ToString();
                    _lastName      = reader["LastName"].ToString();
                    _extensionName = reader["ExtensionName"].ToString();
                    _gender        = reader["Gender"].ToString();
                    _contactNumber = reader["ContactNumber"].ToString();
                    _email         = reader["Email"].ToString();
                    _homeAddress   = reader["HomeAddress"].ToString();
                }
                reader.Close();
            }
            return;
        }
    }
    public void GetCustomerList(DataGridView customerList)
    {
        using (var cmd = new SqlCommand("usp_GetCustomer", Con.GetConnection()))
        {
            cmd.CommandType = CommandType.StoredProcedure;
            using (var sda = new SqlDataAdapter(cmd))
            {
                sda.Fill(DataTable);
                var bsource = new BindingSource { DataSource = DataTable };
                customerList.DataSource = bsource;
            }
        }
        return;
    }
    public bool IsUpdated()
    {
        using (var cmd = new SqlCommand("usp_UpdateCustomer", Con.GetConnection()))
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue("@customerID", _customerId);
            cmd.Parameters.AddWithValue("@imagePath", _imagePath);
            cmd.Parameters.AddWithValue("@firstName", _firstName);
            cmd.Parameters.AddWithValue("@middleName", _middleName);
            cmd.Parameters.AddWithValue("@lastName", _lastName);
            cmd.Parameters.AddWithValue("@extensionName", _extensionName);
            cmd.Parameters.AddWithValue("@gender", _gender);
            cmd.Parameters.AddWithValue("@contactNumber", _contactNumber);
            cmd.Parameters.AddWithValue("@email", _email);
            cmd.Parameters.AddWithValue("@homeAddress", _homeAddress);
            cmd.ExecuteNonQuery();
            return true;
        }
    }
}

控制器:

 class DisplayController
{
    private Connection Con = new Connection();
    private Customer Customer = new Customer();
    private Display _display;

    public DisplayController(Display display)
    {
        _display = display;
        Initialize();
        Customer.GetCustomerList(_display.customerList);
    }
    public void Initialize()
    {
        _display.search.TextChanged += Search_TextChanged;
        _display.customerList.CellClick += CustomerList_CellClick;
    }
    private void CustomerList_CellClick(object sender, DataGridViewCellEventArgs e)
    {
        if (e.RowIndex >= 0)
        {
            var row = _display.customerList.Rows[e.RowIndex];
            Customer.GetID(row.Cells["ID"].Value.ToString());
            DimBackground overlay = new DimBackground(new Update(Customer));
            overlay.Show();
        }
    }
}

我的更新表单的控制器:

class UpdateController
{
    private Update _update;
    private Customer _customer;
    private Display _display = new Display();
    public UpdateController(Update update)
    {
        _update = update;
        Initialize();
    }

    public void Initialize()
    {
        _update.GetUpdateButton.Click += GetUpdateButton_Click;
        _update.GetBrowseButton.Click += GetBrowseButton_Click;
    }

    private void GetBrowseButton_Click(object sender, EventArgs e)
    {
        using (OpenFileDialog ofd = new OpenFileDialog())
        {
            ofd.Filter = "Image Files (*.jpg;*.jpeg;.*.png; | *.jpg;*.jpeg;.*.png;)";
            ofd.FilterIndex = 1;
            ofd.Multiselect = false;
            ofd.Title = "Select Image File";
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                _update.Imagepath = ofd.FileName;
                _update.GetImage.Image = Image.FromFile(_update.Imagepath);
            }
        }
    }
    private void GetUpdateButton_Click(object sender, EventArgs e)
    {
        _customer = new Customer
        (
           _update.LblCustomerID.Text,
           _update.Imagepath,
           _update.GetFirstName().Text,
           _update.GetMiddleName().Text,
           _update.GetLastName().Text,
           _update.GetExtensionName().Text,
           _update.GetGender().Text,
           _update.GetContactNumber().Text,
           _update.GetEmail().Text,
           _update.GetAddress().Text
        );
        if
        (
            string.IsNullOrWhiteSpace(_update.GetFirstName().Text) ||
            string.IsNullOrWhiteSpace(_update.GetLastName().Text) ||
            string.IsNullOrWhiteSpace(_update.GetGender().Text) ||
            string.IsNullOrWhiteSpace(_update.GetAddress().Text)
        )
        {
            CustomMessageBox.Message("Please Input the Required Fields", CustomMessageBox.MessageType.Warning);
        }
        else
        {
            var result = _customer.IsUpdated() ? true : false;
            CustomMessageBox.Message("Updated!", CustomMessageBox.MessageType.Update);
            _customer.GetCustomerList(_display.customerList);
        }
    }
}

【问题讨论】:

  • @PouriaAnsari 已经阅读了那篇文章,但它没有任何帮助
  • 您不需要这样做,您需要做的只是更新数据源,然后更新 datagridview 控件。
  • 你能详细说明一下吗?插入后我需要更新数据源并更新数据网格视图?
  • 如果您的程序本身正在更新是的,您更新数据源,然后更新 datagrdview

标签: c# winforms model-view-controller


【解决方案1】:

您可以创建一个填充 DataGridView 的公共方法并在插入方法中调用函数。

这样

 public DataTable Table()
    {
        try
        {
            connectionString = "Data Source = Your Data source ";
            connection = new SQLiteConnection(connectionString);
            query = "SELECT * From Table";
            connection.Open();
            adapter = new SQLiteDataAdapter(query, connection);
            dataTable = new DataTable();
            adapter.Fill(dataTable);
            connection.Close();
            return dataTable;
        }
        catch(Exception ex)
        {
            MessageBox.Show(ex.Message);
            return null;
        }
    private void FillDataGrid()
    {
        dataTable = Table();
        dataGridView.DataSource = dataTable;
    }

并在插入/更新方法结束时调用此 FillDataGrid()。

【讨论】:

  • 请尝试阅读我的代码,我已经在我的控制器表单上这样做了,我在插入后调用了该方法。
  • 您的 datagridview 是否在运行时在程序内更新?
  • 给定代码sn-p有效,如果数据被插入或更新或删除,它会更新。
  • @JJIqbal 同样的事情,你只是简单地分离了数据源,我试试你的代码,但也不起作用
【解决方案2】:

您应该将 dataTable 设置为数据源。

public void GetCustomerList(DataGridView customerList)
{
    using (var cmd = new SqlCommand("usp_GetCustomer", Con.GetConnection()))
    {
        cmd.CommandType = CommandType.StoredProcedure;
        using (var sda = new SqlDataAdapter(cmd))
        {
            sda.Fill(dtTable);
            customerList.DataSource = dtTable ;
        }
    }
    return;
}

编辑:尽量避免将DataTable命名为“DataTable”,改用dtTable。

【讨论】:

  • 所以我需要在更新查询后调用这些方法?还是在数据源更改时自动更新?
猜你喜欢
  • 2014-02-13
  • 1970-01-01
  • 2023-04-02
  • 2012-04-27
  • 2015-06-23
  • 2013-09-04
  • 1970-01-01
  • 2013-08-25
  • 2021-07-03
相关资源
最近更新 更多