Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.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# 以编程方式向DataGridView添加组合框_C#_.net_Winforms_Datagridview_Datagridviewcombobox - Fatal编程技术网

C# 以编程方式向DataGridView添加组合框

C# 以编程方式向DataGridView添加组合框,c#,.net,winforms,datagridview,datagridviewcombobox,C#,.net,Winforms,Datagridview,Datagridviewcombobox,我需要一些关于这个类的帮助,我不知道是不是只有我一个人,但我真的在用编程的方式处理这个类 您可能会认为,将列添加为组合框这样的简单任务是小菜一碟,但显然不是!我需要以编程方式执行此操作的原因是,我需要在DataGridView中的每一行上设置多个组合框,其中可选择的下拉项将取决于其他一行或多行中的选择等。 下面是我如何初始化我的 到目前为止,一切都很好。现在,当我单击我正在收听的事件中的TreeNodeDecorator(派生自)时。然后,我使用treeNodeActor.Id通过()检索相关对

我需要一些关于这个类的帮助,我不知道是不是只有我一个人,但我真的在用编程的方式处理这个类

您可能会认为,将
添加为
组合框
这样的简单任务是小菜一碟,但显然不是!我需要以编程方式执行此操作的原因是,我需要在DataGridView中的每一行上设置多个组合框,其中可选择的下拉项将取决于其他一行或多行中的选择等。

下面是我如何初始化我的

到目前为止,一切都很好。现在,当我单击我正在收听的事件中的
TreeNodeDecorator
(派生自)时。然后,我使用
treeNodeActor.Id
通过()检索相关对象的列表

对于新检索到的列表,我想清除,然后用新的
行填充
\u objectDataGridView
。 在侦听事件的方法中,我尝试设置
\u objectDataGridView
。像这样

private void SetDataSource(IEnumerable<Object> assignedObjects)
{
    var dataTable = new DataTable();
    dataTable.Columns.Add("Id");
    dataTable.Columns.Add("Name");
    dataTable.Columns.Add("Type");
    dataTable.Columns.Add("Container");
    foreach(var assignedObject in assignedObjects)
    {
        dataTable.Rows.Add(assignedObject.Id,
                           assignedObject.Name,
                           assignedObject.ObjectType,
                           assignedObject.Container);
    }
    _objectDataGridView.DataSource = dataTable;
}
private void SetDataSource(IEnumerable assignedObjects)
{
var dataTable=新的dataTable();
dataTable.Columns.Add(“Id”);
dataTable.Columns.Add(“名称”);
dataTable.Columns.Add(“类型”);
dataTable.Columns.Add(“容器”);
foreach(赋值对象中的var赋值对象)
{
dataTable.Rows.Add(assignedObject.Id,
assignedObject.Name,
assignedObject.ObjectType,
分配对象(容器);
}
_objectDataGridView.DataSource=dataTable;
}
但我还没有设置可供选择的项目。 在创建时,我可以设置一组静态的可选项,但我需要在每行中根据同一行的其他组合框中的选定项动态地单独添加这些项。我真的不知道该怎么做


我想我需要听一个事件,然后用正确的项目填充or。然后,我还需要倾听这些
组合框中的选项何时更改,并填充/更改相关
组合框中的可选项
我最后将
行添加到
DataGridView
中,如下所示:

private void SetDataSource(IEnumerable<Object> assignedObjects, 
                           List<Container> subContainersAssociatedWithSystem)
{
    _objectDataGridView.Rows.Clear();
    foreach (var assignedObject in assignedObjects)
    {
        var newRowIndex = _objectDataGridView.Rows.Add();
        var row = _objectDataGridView.Rows[newRowIndex];
        row.Cells["Id"].Value = assignedObject.Id;
        row.Cells["Name"].Value = assignedObject.Name;
        var containerColumn = (DataGridViewComboBoxCell)row.Cells["Container"];
        containerColumn.DataSource = subContainersAssociatedWithSystem;
        containerColumn.Value = assignedObject.Container.Id;
        var objectTypeColumn = (DataGridViewComboBoxCell)row.Cells["Type"];
        objectTypeColumn.DataSource = new List<ObjectType> {assignedObject.ObjectType};
        objectTypeColumn.Value = assignedObject.ObjectType.Id;
    }
}
private void InitializeDataGridView()
{
    ...
    _objectDataGridView.EditingControlShowing += (sender, e) =>
    {
        var cb = e.Control as ComboBox;
        if (_objectDataGridView.CurrentCellAddress.X == objectTypeComboBoxColumn.DisplayIndex && cb != null)
        {
            var value = _objectDataGridView[containerComboBoxColumn.DisplayIndex, _objectDataGridView.CurrentCellAddress.Y].Value;
            if(value != null)
            {
                var containerId = (int)value;
                using(var dao = _daoFactory.Create(_daoAdminRole))
                {
                    var container = dao.Get<Container>(containerId);
                    var objectTypes = dao.GetByQueryObject(new ObjectTypeQueryObject {ContainerType = new ContainerType {Id = container.ContainerType.Id}});
                    cb.DataSource = objectTypes;
                }
            }
        }
    };
    ...
}

现在,当我单击
ObjectTypeComboxColumn
时,
DataSource
将根据
ContainerComboxColumn
中的选择设置正确的项,您的意思是说ObjectTypeComboxColumn和ContainerComboxColumn将为每一行设置不同的值??是的,它可能有不同的值,具体取决于数据在同一行中,如果我选择了另一个容器,ObjectTypeComboxColumn中的可选项集将更改为匹配,或者如果ContainerComboxColumn中未选择任何内容,则会变为灰色。我唯一不完全理解的部分(这似乎是该过程中非常重要的一部分)是您所说的然后,我使用TreeNodeDecorater.Id通过Fluent NHibernate(ORM)检索相关对象的列表“。您到底在那里做什么?为什么必须依赖外部库来执行这些操作?即使您尝试过存储易于跟踪/存储的属性,如索引?我在整个数据访问解决方案中都使用了FNH,我也希望在这里继续使用它。我可能不得不这样做,但我不想因此而改变我的DataAccessLayer。我提到我使用FNH尝试和你们交流,我有一个对象列表(列表),我需要映射到DataGridView,你们可以自由地做你们想做的事情;但问题似乎存在,如果你需要帮助,也许应该在这方面分享更多信息。在任何情况下,将“更简单的信息”转移到任何外部元素可能更安全;例如:索引(只有一个整数值),而不是整列(很多值)。我在更改
containerComboBox
中的选择时,在尝试更改
objectTypeComboBox
中的选择后,此解决方案出现了一个错误,在我选择与先前选择的选项完全相同的选项或索引0处的第一项之前,所有内容都没有响应。
private void InitializeDataGridView()
{
    ...
    _objectDataGridView.EditingControlShowing += (sender, e) =>
    {
        var cb = e.Control as ComboBox;
        if (_objectDataGridView.CurrentCellAddress.X == objectTypeComboBoxColumn.DisplayIndex && cb != null)
        {
            var value = _objectDataGridView[containerComboBoxColumn.DisplayIndex, _objectDataGridView.CurrentCellAddress.Y].Value;
            if(value != null)
            {
                var containerId = (int)value;
                using(var dao = _daoFactory.Create(_daoAdminRole))
                {
                    var container = dao.Get<Container>(containerId);
                    var objectTypes = dao.GetByQueryObject(new ObjectTypeQueryObject {ContainerType = new ContainerType {Id = container.ContainerType.Id}});
                    cb.DataSource = objectTypes;
                }
            }
        }
    };
    ...
}