簡體   English   中英

提交更改后,DataGridView不更新C#LINQ

[英]DataGridView does not update after submitting changes c# linq

我有一個簡單的客戶注冊表格。 我在數據網格視圖旁邊放置了一些文本框,以便可以添加和更新用戶。 那很好,並且仍然可以。

在此處輸入圖片說明

最近,我為客戶定義添加了一個新的Windows窗體,以便雙擊一行時會出現一個帶有必填字段的窗體,該窗體顯示客戶信息並允許您更改它們。 單擊“確定”按鈕會將更改保存到SQL數據庫。

在網格視圖旁邊的字段中,當我更新用戶信息時,網格視圖將立即更新並顯示數據,但是當使用新表單更新數據時,即使再次雙擊該行也不會在網格視圖中顯示更新。 當我關閉應用程序並再次運行時,我將看到更新的數據。

我為主表單添加了一個激活事件,以通過再次從數據庫中選擇數據來更新網格視圖,但是沒有成功。 這是我用於從側面板進行更新的代碼:

private void btnUpdate_Click(object sender, EventArgs e)
{
    if (btnUpdate.Text == "Update")
    {
        txtUsername.Text = ClientsGridView.CurrentRow.Cells["Username"].Value.ToString();
        txtPassword.Text = ClientsGridView.CurrentRow.Cells["Password"].Value.ToString();
        txtUID.Text = ClientsGridView.CurrentRow.Cells["UID"].Value.ToString();
        txtName.Text = ClientsGridView.CurrentRow.Cells["Name"].Value.ToString();
        chkIsActive.Checked = (bool)ClientsGridView.CurrentRow.Cells["IsActive"].Value;
        chkItemListAccess.Checked = (bool)ClientsGridView.CurrentRow.Cells["ItemListAccess"].Value;
        chkMaterialSumAccess.Checked = (bool)ClientsGridView.CurrentRow.Cells["MaterialSumAccess"].Value;
        chkPartListAccess.Checked = (bool)ClientsGridView.CurrentRow.Cells["PartListAccess"].Value;
        chkPriceListAccess.Checked = (bool)ClientsGridView.CurrentRow.Cells["PriceListAccess"].Value;

        btnUpdate.Text = "Apply Update";
        btnSubmit.Enabled = false;
        txtUsername.ReadOnly = true;
    }
    else if (btnUpdate.Text == "Apply Update")
    {
        if (ClientFormValidation())
        {
            int id = Convert.ToInt32(ClientsGridView.CurrentRow.Cells["ID"].Value.ToString());
            var SelectedUser = from Client in ClientsContext.Clients
                               where Client.ID == id
                               select Client;
            if (SelectedUser.Count() == 1)
            {
                Client UpdatingClient = SelectedUser.Single();
                UpdatingClient.Password = txtPassword.Text.Trim();
                UpdatingClient.UID = txtUID.Text.Trim();
                UpdatingClient.Name = txtName.Text.Trim();
                UpdatingClient.IsActive = chkIsActive.Checked;
                UpdatingClient.ItemListAccess = chkItemListAccess.Checked;
                UpdatingClient.MaterialSumAccess = chkMaterialSumAccess.Checked;
                UpdatingClient.PartListAccess = chkPartListAccess.Checked;
                UpdatingClient.PriceListAccess = chkPriceListAccess.Checked;

                ClientsContext.SubmitChanges();

            }
            ShowAll();
            ClearClientForm();
            btnUpdate.Text = "Update";
            btnSubmit.Enabled = true;
            txtUsername.ReadOnly = false;
        }


    }
}

這是用於客戶定義表格:

private void btnOK_Click(object sender, EventArgs e)
{
    if(ISnewUser)
    {
        InsertNewClient();
    }
    else if(!ISnewUser)
    {
        UpdateClient();
    }
    this.Close();
}

private void UpdateClient()
{
    if (ClientFormValidation())
    {

        var SelectedUser = from Client in ClientsContext.Clients
                           where Client.ID == id
                           select Client;
        if (SelectedUser.Count() == 1)
        {
            Client UpdatingClient = SelectedUser.Single();
            UpdatingClient.Password = txtPassword.Text.Trim();
            UpdatingClient.UID = txtUID.Text.Trim();
            UpdatingClient.Name = txtName.Text.Trim();
            UpdatingClient.IsActive = chkUserActiveSatus.Checked;
            UpdatingClient.ItemListAccess = chkItemListAccess.Checked;
            UpdatingClient.MaterialSumAccess = chkMaterialSummeryAccess.Checked;
            UpdatingClient.PartListAccess = chkPartListAccess.Checked;
            UpdatingClient.PriceListAccess = chkPriceListAcess.Checked;
            ClientsContext.SubmitChanges();


        }

    }
}

誰能告訴我這段代碼有什么問題嗎?

  *var SelectedUser = from Client in ClientsContext.Clients
                                           where Client.ID == id
                                           select Client;

它是可查詢的,應用.ToList()提取到內存中,然后修補更改。

相反,我建議使用此,

var SelectedUser = (from Client in ClientsContext.Clients
                                           where Client.ID == id
                                           select Client).FirstOrDefault();
if(SelectedUser!=null){
                    SelectedUser.Password = txtPassword.Text.Trim();
                    SelectedUser.UID = txtUID.Text.Trim();
                    SelectedUser.Name = txtName.Text.Trim();
                    SelectedUser.IsActive = chkUserActiveSatus.Checked;
                    SelectedUser.ItemListAccess = chkItemListAccess.Checked;
                    SelectedUser.MaterialSumAccess = chkMaterialSummeryAccess.Checked;
                    SelectedUser.PartListAccess = chkPartListAccess.Checked;
                    SelectedUser.PriceListAccess = chkPriceListAcess.Checked;
                    ClientsContext.SubmitChanges();
}
else{
//write your logic
}*

我只將異常處理留給您。

我自己解決了問題,在初始化客戶端定義表單時傳遞了一個Client對象。 因此,為了進行更新,我使用了完全相同的對象,但未獲取其隔離器,並再次從數據庫中選擇了它:

public frmClientDefinition(Client thisClient=null)
        {

            InitializeComponent();
            if (thisClient!=null)
            {
                User = thisClient;
                id = thisClient.ID;
                ISnewUser = false;
                txtName.Text = thisClient.Name;
                txtUsername.Text = thisClient.Username;
                txtPassword.Text = thisClient.Password;
                txtDate.Text = thisClient.Date.ToString();
                txtUID.Text = thisClient.UID;
                chkUserActiveSatus.Checked = thisClient.IsActive;
                chkItemListAccess.Checked = thisClient.ItemListAccess;
                chkPartListAccess.Checked = thisClient.PartListAccess;
                chkMaterialSummeryAccess.Checked = thisClient.MaterialSumAccess;
                chkPriceListAcess.Checked = thisClient.PriceListAccess;
                chkFullPriceListAccess.Checked = false;
                chkOfficialRecieptAccess.Checked = false;
                chkNonOfficialRecieptAccess.Checked = false;
                chkAdvancedPriceControlsAccess.Checked = false;
                chkFullPriceListSaveAccess.Checked = false;
                chkOfficialRecieptSaveAccess.Checked = false;
                chkNonOfficialRecieptSaveAccess.Checked = false;
                txtUsername.ReadOnly = true;
            }
            txtDate.Text = DateTime.Now.ToString();
        }

並更新此代碼段:

private void UpdateClient()
        {
            if (ClientFormValidation())
            {
                    User.Password = txtPassword.Text.Trim();
                    User.UID = txtUID.Text.Trim();
                    User.Name = txtName.Text.Trim();
                    User.IsActive = chkUserActiveSatus.Checked;
                    User.ItemListAccess = chkItemListAccess.Checked;
                    User.MaterialSumAccess = chkMaterialSummeryAccess.Checked;
                    User.PartListAccess = chkPartListAccess.Checked;
                    User.PriceListAccess = chkPriceListAcess.Checked;
                    ClientsContext.SubmitChanges();
            }
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM