【问题标题】:Change ComboBoxCell value inside a Datagridview更改 Datagridview 内的 ComboBoxCell 值
【发布时间】:2018-06-16 17:08:12
【问题描述】:

我正在尝试更改 Datagridview 中的 Combobox 值。进入 datagriview 的数据来自放置在数据集中的 XML 文件。所以基本上我想把数据集放到DataGridView中。第二列应该是一个组合框。我在论坛上读到我应该为 Combobox 制作一本字典,所以我从它开始,但现在如何继续我不太确定。这是我已经准备好的一些代码。这是我在专门课程中开设的两个课程。现在在我的

public class ClassMAVLinkCmd
{
    Dictionary<int, MVLCmdMessage> MAVLnkCommand = new Dictionary<int, MVLCmdMessage>()
    {
        {16, new MVLCmdMessage {UAVCANMode = "UAV_CMD", MAVLinkCommand = "MAV_CMD_NAV_WAYPOINT", MAVLinkMsgId = 16} } ,
        {17, new MVLCmdMessage {UAVCANMode = "UAV_CMD", MAVLinkCommand = "MAV_CMD_NAV_LOITER_UNLIM", MAVLinkMsgId = 17} },
        {18, new MVLCmdMessage {UAVCANMode = "UAV_CMD", MAVLinkCommand = "MAV_CMD_NAV_LOITER_TURNS", MAVLinkMsgId = 18} },
    };
}

public class MVLCmdMessage
{
    public string UAVCANMode { get; set; }
    public string MAVLinkCommand { get; set; }
    public int MAVLinkMsgId { get; set; }

}

现在,当我按下按钮读取文件并将其加载到 DataGridview 中时,我有这个:

private void btnLoad_Click(object sender, EventArgs e)
{

    DataSet dsRoute = new DataSet();

    //Open the file dialog and select a XML file
    if (myOpen.ShowDialog() == DialogResult.OK)
    {
        try
        {
            if ((myStream = myOpen.OpenFile()) != null)
            {
                using (myStream)                               
                dsRoute.ReadXml(myStream);
                strFilename = myOpen.SafeFileName.ToString();
                StatusRouteName.Text = strFilename;

                int i = 0;
                int length = dsRoute.Tables.Count;

                for (i = 0; i < length; i++)
                {
                    DataWayPoints.Rows.Add();
                    int row = WayPointList.Count;
                     DataWayPoints["Waypoint", i].Value = Convert.ToString(i + 1);
                    //DataWayPoints["MAVLnkCmd", i].Value = dsRoute.Tables[i].Rows[0]["MAVLnkCmd"].ToString();
                    //Need to investigate how to set a cmbBox in a DGV!!!!!!!!!!!!!!!!!!!!!!
                    DataWayPoints["P1", i].Value = dsRoute.Tables[i].Rows[0]["P1"].ToString();
                    DataWayPoints["P2", i].Value = dsRoute.Tables[i].Rows[0]["P2"].ToString();
                    DataWayPoints["P3", i].Value = dsRoute.Tables[i].Rows[0]["P3"].ToString();
                    DataWayPoints["P4", i].Value = dsRoute.Tables[i].Rows[0]["P4"].ToString();
                    DataWayPoints["Latitude", i].Value = dsRoute.Tables[i].Rows[0]["Latitude"].ToString();
                    DataWayPoints["Longitude", i].Value = dsRoute.Tables[i].Rows[0]["Longitude"].ToString();
                    DataWayPoints["Altitude", i].Value = dsRoute.Tables[i].Rows[0]["Altitude"].ToString();
                    DataWayPoints["DistanceToNextWpt", i].Value = dsRoute.Tables[i].Rows[0]["DistanceToNextWpt"].ToString();
                    DataWayPoints["Velocity", i].Value = dsRoute.Tables[i].Rows[0]["Velocity"].ToString();
                    }

                lblWayPointTotal.Text = "Waypoint total: " + length.ToString();
                CalcWptDistances();

            }
        }
        catch (Exception )
       {
            MessageBox.Show("Error could not open the selected file");
       }
        UpdateRouteList();
    }           

}

谁能解释一下下一步是什么,非常感谢提前

【问题讨论】:

  • 如果您稍后将使用键来查找值,那么将数据存储在字典中是有意义的。不确定您的数据是什么;但您甚至无法访问 MAVLnkCommand,因为它是一个私有字段。你有没有看到this post?在这里,州名是 List 持有该州城市的关键,然后将其加载到组合单元的项目中..
  • 抱歉,我旅行的回复迟了,我希望 MAVLnkCommand 类可以通过整个程序访问,所以我应该将其设为公开静态。我看过你提到的帖子,但我不完全理解。我基本上尝试做同样的事情,只是对我来说,我只需要组合框中可用的“MAV_CMD_NAV_WAYPOINT”等命令。我只展示了 3 个命令,但有很多只是为了节省我在示例中编写的不必要的代码,只有 3 个。这些命令应该出现在第 2 列中。
  • 不需要显示更多数据,但有助于更好地理解数据结构。你真的让它分布在许多表上并想从每个表中创建一行吗? (正常的方法是有一个表格,其中的行和字段填充 dgv 及其行和单元格..)
  • 我的表是Dataset dsRoute,它是一个XML文件,所以我只有一个表。该表的第二列应该是这个 Combobox。因为在表格中我希望能够调整命令和值。我在 DGV 组合的属性窗口中设置了这些命令。但是当我加载文件时出现错误。保存有效,但加载 XML 文件时出现错误。这个错误是因为我在调试过程中发现的组合框。因此,我在论坛上搜索并找到了与您提到的相同的主题并认为让我们尝试一下。
  • 顺便说一句,有 131 个不同的命令,例如 MAV_CMD_NAV_WAYPOINT,我想用一个组合来选择所有命令。但是在第 1 行中会有一个与第 2 行和第 2 行等不同的命令。我想用它来为我的无人机制定飞行计划。

标签: c# datagridview datagridcomboboxcolumn


【解决方案1】:

如果您在属性窗口中创建项目并使用正确的代码,它就可以正常工作。我想复杂一点。

for (i = 0; i < length+1; i++)
{
    DataWayPoints.Rows.Add();

    DataWayPoints["Waypoint", i].Value = Convert.ToString(i + 1);
    DataGridViewComboBoxCell CommandCell = (DataGridViewComboBoxCell)(DataWayPoints["MAVLnkCmd", i]);
    CommandCell.Value = dsRoute.Tables[i].Rows[0]["MAVLnkCmd"].ToString();
    DataWayPoints["P1", i].Value = dsRoute.Tables[i].Rows[0]["P1"].ToString();
    DataWayPoints["P2", i].Value = dsRoute.Tables[i].Rows[0]["P2"].ToString();
    DataWayPoints["P3", i].Value = dsRoute.Tables[i].Rows[0]["P3"].ToString();
    DataWayPoints["P4", i].Value = dsRoute.Tables[i].Rows[0]["P4"].ToString();
    DataWayPoints["Latitude", i].Value = dsRoute.Tables[i].Rows[0]["Latitude"].ToString();
    DataWayPoints["Longitude", i].Value = dsRoute.Tables[i].Rows[0]["Longitude"].ToString();
    DataWayPoints["Altitude", i].Value = dsRoute.Tables[i].Rows[0]["Altitude"].ToString();
    DataWayPoints["DistanceToNextWpt", i].Value = dsRoute.Tables[i].Rows[0]["DistanceToNextWpt"].ToString();
    DataWayPoints["Velocity", i].Value = dsRoute.Tables[i].Rows[0]["Velocity"].ToString();
}

诀窍在于使用 DataGridViewComboBoxCell 并分配这个,我是这样做的:

DataGridViewComboBoxCell CommandCell = (DataGridViewComboBoxCell)(DataWayPoints["MAVLnkCmd", i]);
CommandCell.Value = dsRoute.Tables[i].Rows[0]["MAVLnkCmd"].ToString();

现在,当我阅读我的文件时,它向我显示了正确的值,但我又遇到了另一个错误,它告诉我“输入矩阵比该表中的列数更长”嗯,很奇怪,因为我到处都算 11 列但这是一个不同的问题。我想我的问题已经解决了。

【讨论】:

  • 如果它适合你。请注意:另一个问题是关于为每一行设置不同的项目,并在状态字段发生变化时将项目列表更新到正确的城市..
  • 是的,我发现这个问题与我的问题不同。通过一遍又一遍地阅读代码,我终于看到了我必须做的事情。感谢您的帮助所以现在努力寻找我的最后一个错误。它告诉我,我拥有的不仅仅是桌子嗯嗯。这些例外情况非常糟糕,哈哈
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-10
  • 2016-05-10
  • 1970-01-01
相关资源
最近更新 更多