列表视图中的menustrip与问题在同一行是相同的,而不是我想到的那一行

时间:2014-07-25 14:21:25

标签: c# listview

我有一个问题是它一次只能占用一个人。如果两个人在里面,那么你只能禁止那些同情的人。如果我是自我内心,那么一切正常。

enter image description here

视频:http://tinypic.com/player.php?v=2d17pm0%3E&s=8#.U9KnGfl_tvB

如果我是自我内心,那么一切正常。但是当它出现的时候,你只能连续不断地禁止它。

我需要帮助来修复代码以使其正常工作? 当我右键单击一行并尝试禁止时。然后尝试它禁止我,而不是我想的那条线。

private void UserListUpdate(string rawdata)
    {
        var data = rawdata.Deserialize();
        listView1.Items.Clear();

        foreach (var user in data)
        {
            var attr = user.Deserialize();
            string nick = attr[0];
            string role = attr[1];
            bool isbanned = attr[2].ToLower() == "true";
            string userid = attr[3];
            string isbannedText = "";
            var ban = new MenuItem("Ban", (a, b) => Client.WritePacket(Packets.UpdateRole(userid, "banned")));
            var unban = new MenuItem("Unban", (a, b) => Client.WritePacket(Packets.UpdateRole(userid, "unbanned")));
            var admin = new MenuItem("Admin", (a, b) => Client.WritePacket(Packets.UpdateRole(userid, Sets.UserRole.Admin)));
            var reg = new MenuItem("Regularize", (a, b) => Client.WritePacket(Packets.UpdateRole(userid, Sets.UserRole.Regular)));
            var kill = new MenuItem("Kill", (a, b) => Client.WritePacket(Packets.Kill(userid)));
            mnuContextMenu.MenuItems.Clear();
            mnuContextMenu.MenuItems.AddRange(new[] { admin, reg, GetSep(), ban, unban, GetSep(), kill });
            ListViewItem t = new ListViewItem(nick);
            if(isbanned == true)
            {
                isbannedText = "Bannad";
            }
            t.SubItems.Add(role);
            t.SubItems.Add(isbannedText);
            t.SubItems.Add(userid);
            listView1.Items.Add(t);
        }
    }

    private void listView1_MouseClick(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Right)
        {
            ContextMenu = mnuContextMenu;
        }
    }

    private MenuItem GetSep()
    {
        return new MenuItem("-");
    }

所以我做了但仍然不起作用。

private void UserListUpdate(string rawdata)
    {
        var data = rawdata.Deserialize();
        listView1.Items.Clear();

        foreach (var user in data)
        {
            var attr = user.Deserialize();
            string nick = attr[0];
            string role = attr[1];
            bool isbanned = attr[2].ToLower() == "true";
            string userid = attr[3];
            string isbannedText = "";
            var ban = new MenuItem("Ban", BanMenu_Clicked);
            var unban = new MenuItem("Unban", BanMenu_Clicked);
            var admin = new MenuItem("Admin", BanMenu_Clicked);
            var reg = new MenuItem("Regularize", BanMenu_Clicked);
            var kill = new MenuItem("Kill", BanMenu_Clicked);
            mnuContextMenu.MenuItems.Clear();
            mnuContextMenu.MenuItems.AddRange(new[] { admin, reg, GetSep(), ban, unban, GetSep(), kill });
            ListViewItem t = new ListViewItem(nick);
            if(isbanned == true)
            {
                isbannedText = "Bannad";
            }
            t.SubItems.Add(role);
            t.SubItems.Add(isbannedText);
            t.SubItems.Add(userid);
            listView1.Items.Add(t);
        }
    }

    private void BanMenu_Clicked(object sender, EventArgs e) {
        foreach (ListViewItem li in listView1.SelectedItems) {
          Client.WritePacket(Packets.UpdateRole(li.SubItems[2].ToString(), "banned")));
        }
    }

    private void listView1_MouseClick(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Right)
        {
            ContextMenu = mnuContextMenu;
        }
    }

    private MenuItem GetSep()
    {
        return new MenuItem("-");
    }

编辑2

private void UserListUpdate(string rawdata)
    {
        var data = rawdata.Deserialize();
        listView1.Items.Clear();

        foreach (var user in data)
        {
            var attr = user.Deserialize();
            string nick = attr[0];
            string role = attr[1];
            bool isbanned = attr[2].ToLower() == "true";
            string userid = attr[3];
            string isbannedText = "";
            var ban = new MenuItem("Ban", BanMenu_Clicked);
            var unban = new MenuItem("Unban", UnBanMenu_Clicked);
            var admin = new MenuItem("Admin", (a, b) => Client.WritePacket(Packets.UpdateRole(userid, Sets.UserRole.Admin)));
            var reg = new MenuItem("Regularize", (a, b) => Client.WritePacket(Packets.UpdateRole(userid, Sets.UserRole.Regular)));
            var kill = new MenuItem("Kill", (a, b) => Client.WritePacket(Packets.Kill(userid)));
            mnuContextMenu.MenuItems.Clear();
            mnuContextMenu.MenuItems.AddRange(new[] { admin, reg, GetSep(), ban, unban, GetSep(), kill });
            ListViewItem t = new ListViewItem(nick);
            if(isbanned == true)
            {
                isbannedText = "Bannad";
            }
            t.SubItems.Add(role);
            t.SubItems.Add(isbannedText);
            t.SubItems.Add(userid);
            listView1.Items.Add(t);
        }
    }

    private void BanMenu_Clicked(object sender, EventArgs e) {
        foreach (ListViewItem li in listView1.SelectedItems) {
            Client.WritePacket(Packets.UpdateRole(li.SubItems[3].Text, "banned"));
            MessageBox.Show(li.SubItems[3].Text);
        }
    }

    private void UnBanMenu_Clicked(object sender, EventArgs e)
    {
        foreach (ListViewItem li in listView1.SelectedItems)
        {
            Client.WritePacket(Packets.UpdateRole(li.SubItems[3].Text, "unbanned"));
            MessageBox.Show(li.SubItems[3].Text);
        }
    }

    private void listView1_MouseClick(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Right)
        {
            Point pt = listView1.PointToScreen(e.Location);
            //contextMenuStrip1.Show(pt);
            ContextMenu = mnuContextMenu;
            //MessageBox.Show("Jaa");
        }
    }

    private MenuItem GetSep()
    {
        return new MenuItem("-");
    }

1 个答案:

答案 0 :(得分:0)

您需要在ListView控件中引用SelectedItems属性以查看当前突出显示的项目,并且由于您的数据只能在ListView中找到,因此您必须从中获取信息。

这样的事情:

var banMenu = new MenuItem("Ban", BanMenu_Clicked);

private void BanMenu_Clicked(object sender, EventArgs e) {
  foreach (ListViewItem li in listView1.SelectedItems) {
    Client.WritePacket(Packets.UpdateRole(li.SubItems[2].ToString(), "banned")));
  }
}

您的UserListUpdate方法正在创建,然后在每次循环迭代中删除菜单项。您应该只在表单的构造函数中创建一次这些菜单项。