繁体   English   中英

DataGrdiview ComboBox 更改结果

DataGrdiview ComboBox change result

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

我的项目有一个带有 Combobox 列的 DataGridView,如图所示,该列有两个项目,即“打孔窗口”和“窗口墙”。

我正在使用 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 列时返回 null。直到这里一切正常。

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

提前谢谢。 在此处输入图像描述

1 个回复

我经常看到人们将 model 与他们的显示方式(视图)交织在一起。 您应该将 model 从视图中分离出来。

If you separate your data from how the data is displayed and later you decide to change how you display your model, for instance from Forms to WPF, changes will not be in your model. 例如,如果您决定更改 model,从 XML 序列化更改为数据库,则您的视图不必更改。

Separation of model and view also makes unit testing your model easier: you don't need to start a Forms program to see whether you handle your model correctly.

我的土耳其语有点生疏,但在我看来,您想显示一系列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,还是因为它是 model 的一部分而制作它:如果您不必在 DataGridView 中显示数据,你还会有一个“ProductType”吗?

Model

我不确定 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 事件的实现将相当容易。

对这个 class 进行单元测试是最少的工作。

很容易看出,如果将来您决定添加一个新的 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 Designer 完成的。 您还需要做一些特殊的事情来填充 ComboBox。 这不是这个问题的一部分。

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

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

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

如果要更新数据,需要把数据放到一个实现了IBindingList的object中,比如BindingList (名字很明显):

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

并且 presto,每个编辑的单元格都会在 BindingList 中自动更新。 即使添加或删除行,即使运算符对显示的行进行排序。 或重新排列列,这是:因为您将视图与 model 分开,所以显示已更改。 你的 model 不是。

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

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());
}

如果你想对 Selected Rows 做一些事情:

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

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

你看,因为你把你的 model 和它的显示方式分开了,处理数据的显示主要是单行方法!

意大利面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