【问题标题】:Change textbox value if change combobox value (System.FormatException: 'Input string was not in a correct format.')如果更改组合框值,则更改文本框值(System.FormatException:'输入字符串格式不正确。')
【发布时间】:2020-05-12 01:17:11
【问题描述】:

如果我更改组合框索引,我将尝试自动加载文本框值 但不明白如果我加载我的表单会收到此错误?

我处理我的 null,如果我忽略这一行,一切都很好!

这是我的表格


这是我的仓库

区域存储库

public string GetAreaNamebyAreaID(int areaID)
{
    var result = db.btbArea.SingleOrDefault(g => g.AreaID == areaID);

    if (result == null)
        return string.Empty;

    return result.AreaName;
}

HowzehRepository

public string GetHowzehNamebyHoezehID(int howzehID)
{
    var result = db.btbHowzeh.SingleOrDefault(g => g.HowzehID == howzehID);
    if (result == null)
        return string.Empty;

    return result.HowzehName;
}

Paygah 存储库

public string GetPaygahNamebyPaygahID(int paygahID)
{
    var result = db.btbPaygah.SingleOrDefault(g => g.PaygahID == paygahID);
    if (result == null)
        return string.Empty;

    return result.PaygahName;
}

如果我更改组合框索引,我会尝试加载我的文本框值

private void frmAreasManage_Load(object sender, EventArgs e)
{
    //Load AreaComboBox Source from AreaTable
    using (UnitOfWork db = new UnitOfWork())
    { 
        cmbAreaNumber.DataSource = db.AreaRepository.Get();
        cmbAreaNumber.DisplayMember = "AreaNumber";
        cmbAreaNumber.ValueMember = "AreaID";
    }
}

private void cmbAreaNumber_SelectedIndexChanged(object sender, EventArgs e)
{
    string selectedValue = cmbAreaNumber.SelectedValue.ToString();
    using (UnitOfWork db = new UnitOfWork())
        if (!string.IsNullOrEmpty(selectedValue))
        {
            {
                //Load HowzehhComboBox From HowzehTable Filter By AreaID
                cmbHowzehNumber.DataSource = db.HowzehRepository.GetNameIDByFilter(selectedValue);

                cmbHowzehNumber.DisplayMember = "HowzehNumber";
                cmbHowzehNumber.ValueMember = "HowzehID";

                //Get AreaName from AreaTable Filter By AreaID
                txtAreaName.Text = db.AreaRepository.GetAreaNamebyAreaID(Convert.ToInt32(selectedValue));
            }
        }
}

private void cmbHowzehNumber_SelectedIndexChanged(object sender, EventArgs e)
{
    string selectedValue = cmbHowzehNumber.SelectedValue.ToString();
    using (UnitOfWork db = new UnitOfWork())
        if (!string.IsNullOrEmpty(selectedValue))
        {
            //Load PaygahComboBox From PaygahTable Filter By HowzehID
            cmbPaygahNumber.DataSource = db.PaygahRepository.GetNameIDByFilter(selectedValue);

            cmbPaygahNumber.DisplayMember = "PaygahNumber";
            cmbPaygahNumber.ValueMember = "PaygahID";
            //Get HowzehName from HowzehTable Filter By HowzehID
            txtHowzehName.Text = db.HowzehRepository.GetHowzehNamebyHoezehID(Convert.ToInt32(selectedValue));
        }
}

private void cmbPaygahNumber_SelectedIndexChanged(object sender, EventArgs e)
{
    using (UnitOfWork db = new UnitOfWork())
    {
        //Get HowzehName from HowzehTable Filter By HowzehID
        txtPaygahName.Text = db.PaygahRepository.GetPaygahNamebyPaygahID(Convert.ToInt32(selectedValue));
    }
}

【问题讨论】:

  • 在屏幕截图中,selectedValue 不是数字。使用if(int.TryParse(selectedValue, out int res)){...} 而不是if (!string.IsNullOrEmpty(selectedValue))。还要确保cmbAreaNumber.Items 是有效数字。
  • 调试器信息显示cmbAreaNumber.SelectedValue不是数字,而是System.Data.Entity.DynamicProxies。这很可能与以下问题有关:Why is EF returning a proxy class instead of the actual entity?
  • @HamidRezaMohammadi 如果我忽略这一行 //txtAreaName.Text = db.AreaRepository.GetAreaNamebyAreaID(Convert.ToInt32(selectedValue));其他线路工作正确翻译成波斯语 hamidreza jan 在线 ro ke 表扬 mikonam hamechi khoobe yani hata vaghti form load mishe error nadaram (yani age iradi daram tooye load form man etefagh miogte - hes mikonam tooye load form bayad ye kari konam ke combobox man kolan null bashe ke changeindex ejra nashe ta vaghti ke yeky entekhabesh kone ) ama nemidoonam chetori man taze shoro kardam
  • 我很抱歉我的第一个评论,我有一个错误,没有注意实际的数据类型。正如罗斯建议的那样,它不是一个数字,而是一个System.Data.Entity.DynamicProxies
  • @RossGurbutt 我关闭延迟加载启用并使用 set Configuration.ProxyCreationEnabled = false;但我的问题没有解决

标签: c# winforms combobox


【解决方案1】:

TL;DR

要解决您的问题,请在方法frmAreasManage_Load 中进行下一次更改:

private void frmAreasManage_Load(object sender, EventArgs e)
{
    //Load AreaComboBox Source from AreaTable
    using (UnitOfWork db = new UnitOfWork())
    { 
        // At first assign properties DisplayMember and ValueMember.
        cmbAreaNumber.DisplayMember = "AreaNumber";
        cmbAreaNumber.ValueMember = "AreaID";

        // And then assign DataSource property of the cmbAreaNumber.
        cmbAreaNumber.DataSource = db.AreaRepository.Get();
    }
}

说明

为什么我们需要在DataSource 属性之前分配ValueMember

当我们分配DataSource 属性时,分配集合的第一项变为SelectedValueComboBox。这会触发ComboBox.SelectedIndexChanged 事件。

如果我们在ValueMember 之前分配DataSource(因此是ValueMember = null),那么CombobBox.SelectedValue 就是集合本身的第一项。在您的情况下,SelectedValuebtbArea 类型的对象。因此,当我要求您在 cmbAreaNumber_SelectedIndexChanged 处理程序中使用下一个代码时

txtAreaName.Text = db.AreaRepository.GetAreaNamebyAreaID(((btbArea) cmbAreaNumber.SelectedValue).AreaID);

它解决了第一次加载的问题。但后来你得到了System.InvalidCastException: 'Unable to cast object of type 'System.Int32' to type 'Gim.DataLayer.btbArea'。发生此错误是因为 ValueMember 属性被分配给值 AreaID 并且从那一刻起,ComboBox.SelectedValue 就是 btbArea 的属性 int AreaID 的值。

如果我们分配ValueMember = "AreaID",然后分配DataSource,那么每当引发ComboBox.SelectedIndexChanged 事件时,SelectedValue 就是属性AreaID 的值。因此,为了防止SelectedValue 成为btbArea 类型的对象(ValueMember = null 时的情况),我们必须首先分配ValueMember,然后再分配DataSource

【讨论】:

  • 这里真的是教室,谢谢你的信息
猜你喜欢
  • 2023-03-14
  • 2011-11-23
  • 2022-06-24
  • 2018-04-12
  • 2020-12-26
  • 2021-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多