繁体   English   中英

DataGrdiview ComboBox 更改结果

DataGrdiview ComboBox change result

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我的项目有一个带有 Combobox 列的 DataGridView,该列有两个项目,如您在图片中看到的“Punch Window”和“Window Wall”。

我正在使用 dataGridView1_CellEndEdit 事件,这些是我的代码

for (int i = 0; i < dgv_MaliyetCalismasi.Rows.Count; i++)
     {
       if (dgv_MaliyetCalismasi.Rows[i].Cells["col_numberofProduct"].Value != null)
         {
         if (dgv_MaliyetCalismasi.Rows[i].Cells["col_numberofProduct"].Value.ToString() == "PUNCH WINDOW")
                   {
                        dgv_MaliyetCalismasi.Rows[i].Cells["col_pcs"].Value = "No entry";
                        dgv_MaliyetCalismasi.Rows[i].Cells["col_pcs"].ReadOnly = true;
                   }
                   else
                   {
                        dgv_MaliyetCalismasi.Rows[i].Cells["col_pcs"].Value = null;
                        dgv_MaliyetCalismasi.Rows[i].Cells["col_pcs"].ReadOnly = false;
                   }
          }
     }

当我选择打孔窗口(A 列)时,另一列(B 列)返回“无条目”。 当我选择 A 列“窗口墙”时,B 列返回空值。直到这里一切正常。

我的问题是当 A 列选择“窗口墙”项时,我尝试在 B 列中输入一些数据,然后 dataGridView1_CellEndEdit 事件开始并使 B 列再次为空。 我怎样才能防止这种情况。 选择 Window Wall 后,我想处理 cellandedit 事件或希望 B 列单元格独立运行。 我希望用户可以在 B 列单元格中输入数据。

提前谢谢。 在此处输入图片说明

1 个回复

我经常看到人们将他们的模型与其显示方式(视图)交织在一起。 您应该将模型与视图分开。

如果您将数据与数据的显示方式分开,然后您决定更改模型的显示方式,例如从 Forms 更改为 WPF,更改将不会出现在您的模型中。 如果您决定更改模型,例如,从 XML 序列化更改为数据库,则您的视图不必更改。

模型和视图的分离还使您的模型单元测试更容易:您不需要启动 Forms 程序来查看您是否正确处理了您的模型。

我的土耳其语有点生疏,但在我看来,您希望显示一系列MaliyetCalismasi ,其中每个MaliyetCalismasi至少有一个Number 、一个ProductType和一个Pcs ,无论是什么。

乍一看,ProductType 和 Pcs 之间似乎是有关系的。 似乎如果 ProductType 等于“Punch Window”,那么 Pcs 应该是“No Entry”,如果 ProductType 等于“Window Wall”,那么 Pcs 就等于 null。

显然以上是无效的:可以将 Pcs 更改为“No Entry”和 null 以外的其他值。 如果操作员在 Pcs 中键入不同的值,则您没有指定 ComboBox 的值:显示空的 ComboBox? 显示原始值?

您应该决定:您制作ProductType只是因为我希望能够在我的 DataGridView 中进行 ComboBox 选择,还是您制作它是因为它是模型的一部分:如果您不必在 DataGridView 中显示数据,你还会有“ProductType”吗?

型号

我不确定 ProductType 是否可以有超过这两个值。 让我们假设不是。 如果它可以有更多的值,你应该改变类型。

enum ProductType
{
    PunchWindow,
    WindowWall,
    ...          // other Values?
}

class MaliyetCalismasi
{
    public int Number {get; set;}
    public string Pcs {get; set;}

    // TODO: ProductType
}

我们知道如果有人将 ProductType 设置为 ProductType.PunchWindow 属性 Pcs 会发生什么。 但是,如果有人更改了 Pcs,ProductType 会发生什么变化吗?

private ProductType productType = ProductType.WindowWall;

public ProductType ProductType
{
    get => this.productType;
    set
    {
        if (this.ProductType != value)
        {
            this.productType = value;
            this.OnProductTypeChanged();
        }
    }
}

private void OnProductTypeChanged()
{
    const string pcsPuncWhindowValue = "No Entry";

    if  (this.ProductType == ProductType.PunchWindow}
    {
        this.Pcs = pcsPunchWindowValue;
    }
    else
    {
        this.Pcs = null;
    } 
}

如果更改了 Pcs,您希望 ProductType 怎么样? 什么都没有? 还是第三个值?

private string pcs = null;
public string Pcs
{
    get => this.pcs
    set
    {
        if (this.Pcs != value)
        {
            this.pcs = value;
            this.OnPcsChanged();
        }
    }
}

顺便说一下,您是否看到,因为我创建了 On...Changed 方法,PropertyChanged 事件的实现将相当容易。

对此类进行单元测试是最少的工作。

很容易看出,如果将来您决定添加一个新的 ProductType 值“ManualSelected”,这意味着如果有人更改了 Pcs,ProductType 获得的值,那么更改将是最小的。

显示 MaliyetCalismasi

人们倾向于直接编辑 DataGridView 中的单元格。 如果你想这样做,再想一想。 如果你仍然认为它是必要的,那就去做吧。 使用数据源更容易。

// Create the DataGridView and the add the columns
DataGridView dataGridView1 = new DataGridView();
DataGridViewColumn columnNumber = new DataGridViewColumn();
DataGridViewColumn columnPcs = new DataGridViewColumn();
DataGridViewComboBoxColumn columnProductType = new DataGridViewComboBoxColumn();

// which properties should these column show?
columnNumber.DataPropertyName = nameof(MaliyetCalismasi.Number);
columnPcs.DataPropertyName = nameof(MaliyetCalismasi.Pcs);
columnProductType.DataPropertyName = nameof(MaliyetCalismasi.ProductType);

通常上述操作是使用 Visual Studio 设计器完成的。 您还需要做一些特殊的事情来填充 ComboBox。 这不是这个问题的一部分。

现在只做一个 Display,你需要做的就是将数据分配给 DataGridView 的 DataSource:

List<MaliyetCalismasi> fetchedMaliyetCalismasi = this.FetchMaliyetCalismasi();
this.dataGridView1.DataSource = fetchedMaliyetCalismasi;

这将仅显示:如果操作员更改了显示的数据:更改单元格、添加或删除行,则不会更新原始数据。

如果你想要更新数据,你需要把数据放在一个实现了 IBindingList 的对象中,比如BindingList (明显的名字):

this.dataGridView.DataSource = new BindingList<MaliyetCalismasi>
    (fetchedMaliyetCalismasi);

而且很快! 每个编辑过的单元格都会在 BindingList 中自动更新,即使添加或删除了 Rows。 即使操作员对显示的行进行排序,或重新排列列。 这是因为您将视图与模型分开:显示已更改,而模型未更改。

将数据与其显示方式分开的良好做法将导致以下过程:

BindingList<MaliyetCalismasi> MaliyetCalismasi
{
    get => (BindingList<MaliyetCalismasi>)this.DataGridView1.DataSource;
    set => this.DataGridView1.DataSource = value;
}

IEnumerable<MaliyetCalismasi> FetchMaliyetCalismasi()
{
    // TODO implement, fetch from database, or Json, or internet, or whatever
}

void InitDataGridView
{
    this.MaliyetCalismasi = new BindingList<MaliyetCalismasi>(
        this.FetchMaliyetCalismasi().ToList());
}

如果你想对选定的行做一些事情:

MaliyetCalismasi CurrentMaliyetCalismasi => 
    this.DataGridView1.CurrentRow?.DataBoundItem as MaliyetCalismasi;

IEnumerable<MaliyetCalismasi> SelectedMaliyetCalismasi =>
    this.DataGridView1.SelectedRows
        .Select(row => row.DataBoundItem)
        .Cast<MaliyetCalismasi>();

您看,因为您将模型与其显示方式分开,所以处理数据的显示主要由单行方法组成!

意大利面 kadar kolay!

1 我该如何更改?

这段代码是通过Verlet方法计算Sun-Jupyter的运动而编写的,现在我必须将事物(Sun_x,Sun_y,Planet_x等)更改为数组格式。 我已经尝试过,但它会不断吐出错误消息 ...

2 更改“

我有以下选择字段: 我想即时更改图片中的网址。 图像代码为: 因此,当用户选择任何国家/地区时, href url必须附加国家/地区值(例如,选择“ Japan”): 怎么做? ...

3 我该如何更改

当单击另一个div(图库)中的图像时,我有一个脚本来更改显示在div(main_view)中的img src: JS 的HTML 然后,我想允许用户单击main_view div中显示的图像以导航到与该图像关联的页面。 我是jquery和js的新手,并且尚未成功编写脚 ...

2011-02-09 22:41:46 2 3569   jquery
4 更改iframe而不更改此代码

我已在我的网站上永久添加以下代码: 是否有可能在不编辑此代码的情况下将scrolling =" no "更改为scrolling =" yes " 。 除了此代码外,我可以添加所有内容。 是否可以在一些将改变重要性的代码旁边添加? ...

5 如何通过更改状态来更改 URL

我有一个父母和两个孩子。 我正在尝试通过按下按钮来更改图像 url,但没有成功......我似乎无法将数据从按钮子级传递到图像子级 .. 家长: 按钮子: 图像儿童: ...

2020-03-21 20:40:34 1 67   reactjs
6 更改backgroundColor更改边框

在IE7中,单击下面的文本框会将边框更改为插图。 它在最新的FireFox中运行良好,但在v3.0.10中却无法运行 奇怪的怪癖。 对于使用IE8的用户,是否已解决? 我的解决方法是使用this.style.border =“ 1px纯黑;”重置边框。 ...

7 更改Radgrid值会更改其他

我有一个Radgrid,其列可以有2个值:是或否。 值显示在标签中,当我在该单元格上双击时,它变为组合框,因此用户可以选择是或否。 现在,我要实现以下目标:当我将一行设置为YES时,我希望所有其他行设置为NO。 因此,它将总是只有一行,其值为YES。 我希望你能理解我。 怎么做? ...

9 如果更改其他变量,变量也会更改

每当我创建一个类的实例,创建一个分配了第一个实例的变量,并在第二个变量上使用该类的属性时,我的第一个变量就会更改。 当我不使用a.add()时,为什么a.value给我11? ...

10 动态更改更改位置

好的,我有一个php循环,可自动创建下拉列表。 现在,我有了Javascript,可以根据前一个下拉列表的选择动态更新另一个下拉列表。 现在这是我的问题,在php中有25对下拉列表,这些下拉列表是用ID为“ player#”的唯一下拉列表创建的,并通过更改下拉列表动态更新“ charact ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM