Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果更改组合框值(System.FormatException:';输入字符串的格式不正确,请更改文本框值。';)_C#_Winforms_Combobox - Fatal编程技术网

C# 如果更改组合框值(System.FormatException:';输入字符串的格式不正确,请更改文本框值。';)

C# 如果更改组合框值(System.FormatException:';输入字符串的格式不正确,请更改文本框值。';),c#,winforms,combobox,C#,Winforms,Combobox,如果更改组合框索引,我将尝试自动加载文本框值 但是我不明白如果我加载我的表单,我会收到这个错误吗 我处理空值,如果我忽略这一行,一切都很好 这是我的表格 这是我的仓库 区域存储库 public string GetAreaNamebyAreaID(int areaID) { var result = db.btbArea.SingleOrDefault(g => g.AreaID == areaID); if (result == null) retu

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

我处理空值,如果我忽略这一行,一切都很好

这是我的表格


这是我的仓库

区域存储库

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

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

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

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

    return result.PaygahName;
}
何其乐观

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

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

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

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

    return result.PaygahName;
}
工资假定

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

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

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

    return result.HowzehName;
}
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));
    }
}
TL;博士 要解决您的问题,请在方法
frmareasmanagement\u 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();
    }
}

解释 为什么我们需要在
数据源
属性之前分配
ValueMember

当我们分配
DataSource
属性时,分配的集合的第一项成为
组合框的
SelectedValue
。这将触发组合框。SelectedIndexChanged
事件

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

txtAreaName.Text = db.AreaRepository.GetAreaNamebyAreaID(((btbArea) cmbAreaNumber.SelectedValue).AreaID);
它解决了第一次加载的问题。但随后您得到了
System.InvalidCastException:“无法将类型为”System.Int32“的对象强制转换为类型为“Gim.DataLayer.btbArea”
。发生此错误的原因是,
ValueMember
属性被分配给值
AreaID
,并且从那时起,
ComboBox。SelectedValue
btbArea
的属性
int-AreaID
的值

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

TL;博士 要解决您的问题,请在方法
frmareasmanagement\u 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();
    }
}

解释 为什么我们需要在
数据源
属性之前分配
ValueMember

当我们分配
DataSource
属性时,分配的集合的第一项成为
组合框的
SelectedValue
。这将触发组合框。SelectedIndexChanged
事件

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

txtAreaName.Text = db.AreaRepository.GetAreaNamebyAreaID(((btbArea) cmbAreaNumber.SelectedValue).AreaID);
它解决了第一次加载的问题。但随后您得到了
System.InvalidCastException:“无法将类型为”System.Int32“的对象强制转换为类型为“Gim.DataLayer.btbArea”
。发生此错误的原因是,
ValueMember
属性被分配给值
AreaID
,并且从那时起,
ComboBox。SelectedValue
btbArea
的属性
int-AreaID
的值


如果分配
ValueMember=“AreaID”
然后分配
DataSource
,则每当引发
ComboBox.SelectedIndexChanged
事件时,
SelectedValue
是属性
AreaID
的值。因此,为了防止
SelectedValue
成为类型为
btbArea
的对象(当
ValueMember=null
时的情况),我们必须首先分配
ValueMember
,然后在屏幕截图中分配
DataSource

SelectedValue
不是一个数字。使用
if(int.TryParse(selectedValue,out int res)){…}
代替
if(!string.IsNullOrEmpty(selectedValue))
。还要确保
CMBReaNumber。项
是有效的数字。调试器信息显示
CMBReaNumber.SelectedValue
不是数字,而是
System.Data.Entity.DynamicProxies
。这可能与以下问题有关:@HamidRezaMohammadi,如果我忽略这一行//txtAreaName.Text=db.AreaRepository.GetAreaNamebyAreaID(Convert.ToInt32(selectedValue));其他线路工程正确翻译为波斯语hamidreza-jan-man线路,推荐mikonam hamechi khoobe yani hata vaghti表单加载错误nadaram(亚尼时代的伊拉克人从埃特法格·米奥特手中接过——他从巴亚德手中接过了从组合框中接过的米科纳姆·图伊手中接过的一封信,内容为零,内容为改变指数ejra nashe ta vaghti ke yeky entekhabesh kone)ama Nemidonam chetori man taze shoro kardamI很抱歉我的第一个评论,我有一个错误,没有注意到实际的数据类型。正如Ross建议的那样,它不是一个数字,而是一个
System.data.Entity.DynamicProxies
@RossGurbutt我关闭延迟加载启用,并使用set Configuration.ProxyCreationEnabled=false;但是我的问题在屏幕截图中没有解决,
selectedValue
不是一个数字。请使用
if(int.TryParse(selectedValue,out int res)){…}
而不是
if(!string.IsNullOrEmpty(selectedValue))
。还要确保
CMBReaNumber。项
是有效的数字。调试器信息显示
CMBReaNumber.SelectedValue
不是数字,而是一个
System.Data.Entity.DynamicProxies
。这可能与以下问题有关:@HamidRezaMohammadi,如果忽略此行//txtAreaName.Text=db。AreaRepository.GetAreaNamebyAreaID(转换为.ToInt32(selectedValue));其他行