Datagridview - 从Combobox填充行

时间:2016-11-28 09:44:14

标签: vb.net datagridview combobox

我已将 public void setImage(final Context c,final String imageUrl){ try { if (imageUrl!=null) { // Picasso.with(c).load(imageUrl).error(R.mipmap.add_btn).fit().centerInside().placeholder(R.mipmap.add_btn) .networkPolicy(NetworkPolicy.OFFLINE).into(imagePost, new Callback() { @Override public void onSuccess() { } @Override public void onError() { //Reloading an image again ... Picasso.with(c).load(imageUrl).error(R.mipmap.add_btn).placeholder(R.mipmap.add_btn) .into(imagePost); } }); } else { imagePost.setVisibility(View.GONE); } } catch (Exception e){ } } public void setVideo(final Context c, final String videoUrl){ try { if (videoUrl!=null) { try { Uri videoUri = Uri.parse(videoUrl); try { videoLayout.setVideoURI(videoUri); videoLayout.setTag(videoUrl); String hasVideo_string = (String) videoLayout.getTag(); boolean hasVideo = Boolean.parseBoolean(hasVideo_string); } catch (IOException e) { e.printStackTrace(); } } catch (Exception e) { System.out.println("Error :" + e); } } else { videoLayout.setVisibility(View.GONE); } } catch (Exception e){ } } 设置为在combobox的{​​{1}}中显示。现在,我正在尝试从column1事件中填充出现Combobox的同一行Datagridview。这是我显示组合框的代码:

Datagridview

我尝试了很多东西,但我不知道如何确定Combobox出现在哪一行以及如何将Combobox_Key_Down行赋予Private Sub My_DGV_CellMouseClick(sender As Object, e As DataGridViewCellMouseEventArgs) Handles MY_DGV.CellMouseClick If e.RowIndex >= 0 Then With My_DGV If .Columns(.Rows(e.RowIndex).Cells(e.ColumnIndex).ColumnIndex).Name = "Column1" Then .CurrentCell = .Rows(.CurrentRow.Index).Cells(.CurrentCell.ColumnIndex) Show_Combobox(.CurrentRow.Index, .CurrentCell.ColumnIndex) 'function that shows my Combobox in that cells Combo.Visible = True Else Combo.Visible = False End If End With End If End Sub 值。有人请告诉我应该怎么做的线索。提前谢谢!

1 个答案:

答案 0 :(得分:2)

您的方法的第一个问题是DGV只能有一个DataSource:它可以显示m:m关联表相关元素。如果将其中一个表中的列包含在查询中以供显示,则该表将变为不可更新,并且用户可能会混淆为什么他们无法编辑他们可以看到的内容。它们描述它似乎没什么价值,因为在之后选择它们之前,它们无法看到详细数据。

接下来,它需要另一个数据表来提供CboColB的详细信息。由于您希望DGV绑定到DataTable轻松更新,您最终不得不一遍又一遍地将数据戳入单元格。

最后,考虑用户面临的问题。使用Country表(200个国家/地区的ISO代码和名称)和标志颜色列表,CountryFlagColors的表将有数百行(每个标志只有2种颜色)。

更好的显示可能是将m:m表(flagcolor)过滤为所选项目,以便用户只面对他们当前感兴趣的数据子集:

enter image description here

DGV中使用的数据表是从m:m表构建的:

  • 隐藏国家/地区列。
  • 当他们从顶部的CBO中选择时,它被用作RowFilter以将行限制为相关的行。
  • RowValidating事件中,当国家/地区单元格为DBNull 时,将SelectedValue从国家/地区组合复制到DGV单元格以填充空白
    • 我可能真的会让用户单击一个按钮并手动添加一行,这样我就可以播种国家/地区值,而不是依赖于事件。
  • 它使用DataAdapter,在添加X个标记定义后,da.Update(dtFlagColors)应用/保存所有更改。

好的,这样就提供了核心功能来分配N种颜色选择来定义一个国家的旗帜颜色。缺少的元素是Color项的“细节”。

我在Color表中添加了一个没有意义的int和字符串项,显示这些的一种方法是在SQL中创建一个带有重要细节的别名。将它们显示为离散元素可以使查询不可更新,也可以邀请用户编辑这里无法编辑的内容。我愚蠢的SQL:

"SELECT Id, Name, Concat(Name , ' (' , intItem , ' ' , stritem,')') As Info from FColor"

然后使用'Info'作为dgv:

中CBO列的显示成员
dc = DirectCast(dgvCF.Columns(0), DataGridViewComboBoxColumn)
dc.DataSource = dtFlagColors
dc.DisplayMember = "info"
dc.ValueMember = "id"
dgvCF.DataSource = dtSample

组合列当然有自己的数据源,以便显示一件事并使用另一件作为值来回馈给您。结果(值很傻):

enter image description here

这不完全是你想要的,但接近并且更简单。它几乎不需要用于驱动关联实体的代码。另一种方法是使用DGV作为第二个选择器,这样您就可以显示扩展数据并手动向DGV添加行:

enter image description here

如果将下拉样式设置为Nothing,则它看起来像文本列。