如何在选项卡控件中迭代并确定数组是否为空?

时间:2014-11-27 17:23:39

标签: c# arrays tabcontrol

对不起,标题令人困惑,但我不知道如何提出这个问题;如果有人可以提供更好的头衔我会很感激。

我正在建立一个球员及其比赛表现的数据库。使用选项卡控件显示匹配项,匹配项内存储在面板中的字段。匹配量最多为5,因此每个字段是一个大小为5的数组,表示不同匹配的不同值。我遇到了试图保存那个独特播放器的标签(匹配)数量的问题。

因为标签的数量延续到显示的下一个播放器,我试图遍历所有匹配和该播放器的所有字段,确定哪些匹配包含空字段并分别删除该标签(匹配)。因此,如果玩家1的3个匹配字段中的值,但玩家2只有2个匹配包含字段中的值,则第3个匹配(选项卡)将被删除,因为字段没有值。

更好地解释一下,这是GUI: Picture

我尝试迭代每场比赛的领域看起来像这样:

int[] csNumberTF = ((Player)GameDB[currentEntryShown]).csNumber[tabMatches.SelectedIndex];
int i = 0;
        while (i < 5)
        {
            if (csNumberTF[i] == 0)
            {
                int tabsLeft = tabMatches.TabCount;
                if(tabsLeft > 1)
                tabMatches.TabPages.Remove(tabMatches.SelectedTab);
                tabsLeft--;
            }
            i++;
        }

但我收到错误:Cannot implicitly convert type 'int' to 'int[]'

如果有人可以帮助我,我真的很高兴,我知道代码很长但是它的组织和标题应该有所帮助。

完整代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Collections;
using System.Text.RegularExpressions;
using System.Runtime.Serialization.Formatters.Binary;

namespace Assignment1_Template2
{
public partial class Form1 : Form
{

    // =======================DATA STRUCTURE ===========================
    [Serializable]

    private struct Player
    {   //CONSTRUCTOR
        public Player(int noOfMatches)
        {
            uniquePlayerId = new int[noOfMatches];

            playerIgName = "";
            contactStreet = "";
            contactTown = "";
            contactPostcode = "";
            contactEmail = "";
            contactTelephone = "";
            imagePath = "";
            matchesCount = 0;
            csNumber = new int[noOfMatches];
            killsNumber = new int[noOfMatches];
            deathsNumber = new int[noOfMatches];
            assistsNumber = new int[noOfMatches];
            minutesNumber = new int[noOfMatches];
            for (int i = 0; i < noOfMatches; ++i)
            {
                uniquePlayerId[i] = 0;
                csNumber[i] = 0;
                killsNumber[i] = 0;
                deathsNumber[i] = 0;
                assistsNumber[i] = 0;
                minutesNumber[i] = 0;
            }
        }

        //DATA TYPES
        public int[] uniquePlayerId;
        public int[] csNumber;
        public int[] killsNumber;
        public int[] deathsNumber;
        public int[] assistsNumber;
        public int[] minutesNumber;
        public int matchesCount;
        public string playerIgName;
        public string contactStreet;
        public string contactTown;
        public string contactPostcode;
        public string contactEmail;
        public string contactTelephone;
        public string imagePath;
    }

    //GLOBAL VARIABLES
    public ArrayList GameDB;
    public ArrayList playerMatch;
    private int currentEntryShown = 0;
    private int numberOfEntries = 0;
    private string filename = "W:\\test.dat"; 
    public string prevImage = "";

    // =========================================================================
    // ====================== STARTING POINT ===================================
    // =========================================================================
    public Form1()
    {
        InitializeComponent();
        GameDB = new ArrayList();
        LoadData();
        ShowData();
        UpdatePrevNextBtnStatus();
    }

    // =========================================================================
    // ========================= BUTTON ACTION HANDLERS ========================
    // =========================================================================
    private void showPreviousBtn_Click(object sender, EventArgs e)
    {
        --currentEntryShown;
        ShowData();
        UpdatePrevNextBtnStatus();
    }

    private void showNextBtn_Click(object sender, EventArgs e)
    {
        ++currentEntryShown;
        if (currentEntryShown < GameDB.Count)
        {
            ShowData();
        }
        UpdatePrevNextBtnStatus();
    }

    private void addNewPlayerBtn_Click(object sender, EventArgs e)
    {
        ++numberOfEntries;
        currentEntryShown = numberOfEntries - 1;
        Player aNewStruct = new Player(5);
        GameDB.Add(aNewStruct);
        ShowData();
        addNewPlayerBtn.Enabled = true;
        UpdatePrevNextBtnStatus();
    }
    private void SaveBtn_Click(object sender, EventArgs e)
    {
        SaveData();
        addNewPlayerBtn.Enabled = true;
        UpdatePrevNextBtnStatus();
    }
    private void deletePlayerBtn_Click(object sender, EventArgs e)
    {
        numberOfEntries--;
        GameDB.RemoveAt(currentEntryShown);
        SaveData();
        currentEntryShown--;
        if (currentEntryShown <= GameDB.Count)
        {
            ShowData();
        }

        UpdatePrevNextBtnStatus();
    }
    private void uploadButton_Click(object sender, EventArgs e)
    {
        try
        {
            openFileDialog1.Title = "Select an image file";
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                Player aNewStruct = new Player(5);
                aNewStruct = (Player)GameDB[currentEntryShown];
                aNewStruct.imagePath = openFileDialog1.FileName;
                GameDB[currentEntryShown] = aNewStruct;
                playerPictureBox.ImageLocation = openFileDialog1.FileName;
            }

        }
        catch (Exception ex)
        {
            MessageBox.Show("Error: " + ex.Message);
        }
    }
    private void searchBtn_Click(object sender, EventArgs e)
    {
        string toFind;
        string source;

        toFind = searchInput.Text;
        toFind = toFind.ToLower();

        for (int i = 0; i < GameDB.Count; ++i)
        {   
            source = ((Player)GameDB[i]).playerIgName + ((Player)GameDB[i]).contactStreet;
            source = source.ToLower(); 

            if (source.Contains(toFind))
            {
                currentEntryShown = i;
                ShowData();
                UpdatePrevNextBtnStatus();
                break; 
            }

            if (i == (GameDB.Count - 1))
            {
                MessageBox.Show(toFind + " not found");
            }

        }
    }
    private void saveButton_Click(object sender, EventArgs e)
    {
        SaveData();
        UpdatePrevNextBtnStatus();

    }
    private void addNewMatchBtn_Click(object sender, EventArgs e)
    {
        TabPage newTP = new TabPage();
        if (tabMatches.TabCount <= 4)
        {
            tabMatches.TabPages.Add(newTP);
            int TabPageNumber = tabMatches.SelectedIndex + 1;
            tabMatches.TabPages[TabPageNumber].Text = "Match " + (TabPageNumber + 1);

            tabMatches.SelectTab(TabPageNumber);
            deleteMatchBtn.Enabled = true;

            panel1.Parent = tabMatches.SelectedTab;
        }

        ShowData();
    }
    private void deleteMatchBtn_Click(object sender, EventArgs e)
    {
        tabMatches.TabPages.Remove(tabMatches.SelectedTab);
        int lastTabNumber = tabMatches.TabCount - 1;
        tabMatches.SelectTab(lastTabNumber);
        if (tabMatches.SelectedIndex < 1) deleteMatchBtn.Enabled = false;
    }

    // =========================================================================
    // ================ HANDLE DATA CHANGES BY USER ============================
    // =========================================================================
    private void playerIdBox_TextChanged(object sender, EventArgs e)
    {
        Player aNewStruct = new Player(5);
        aNewStruct = (Player)GameDB[currentEntryShown];
        aNewStruct.uniquePlayerId[0] = Convert.ToInt32(playerIdBox.Text);
        GameDB[currentEntryShown] = aNewStruct;
    }
    private void playerIgNameBox_TextChanged(object sender, EventArgs e)
    {
        Player aNewStruct = new Player(5);
        aNewStruct = (Player)GameDB[currentEntryShown];
        aNewStruct.playerIgName = playerIgNameBox.Text;
        GameDB[currentEntryShown] = aNewStruct;
    }
    private void contactStreetBox_TextChanged(object sender, EventArgs e)
    {
        Player aNewStruct = new Player(5);
        aNewStruct = (Player)GameDB[currentEntryShown];
        aNewStruct.contactStreet = contactStreetBox.Text;
        GameDB[currentEntryShown] = aNewStruct;
    }

    private void contactTownBox_TextChanged(object sender, EventArgs e)
    {
        Player aNewStruct = new Player(5);
        aNewStruct = (Player)GameDB[currentEntryShown];
        aNewStruct.contactTown = contactTownBox.Text;
        GameDB[currentEntryShown] = aNewStruct;
    }

    private void contactPostcodeBox_TextChanged(object sender, EventArgs e)
    {
        Player aNewStruct = new Player(5);
        aNewStruct = (Player)GameDB[currentEntryShown];
        aNewStruct.contactPostcode = contactPostcodeBox.Text;
        GameDB[currentEntryShown] = aNewStruct;
    }

    private void contactEmailBox_TextChanged(object sender, EventArgs e)
    {
        Player aNewStruct = new Player(5);
        aNewStruct = (Player)GameDB[currentEntryShown];
        aNewStruct.contactEmail = contactEmailBox.Text;
        GameDB[currentEntryShown] = aNewStruct;
    }

    private void contactTelephoneBox_TextChanged(object sender, EventArgs e)
    {
        Player aNewStruct = new Player(5);
        aNewStruct = (Player)GameDB[currentEntryShown];
        aNewStruct.contactTelephone = contactTelephoneBox.Text;
        GameDB[currentEntryShown] = aNewStruct;
    }

    //Match data
    private void tabMatches_SelectedIndexChanged(object sender, EventArgs e)
    {

        panel1.Parent = tabMatches.SelectedTab;
        ShowData();

    }

    private void numCS_ValueChanged(object sender, EventArgs e)
    {
        Player aNewStruct = new Player(5);
        aNewStruct = (Player)GameDB[currentEntryShown];
        aNewStruct.csNumber[tabMatches.SelectedIndex] = (int)numCS.Value;
        GameDB[currentEntryShown] = aNewStruct;
    }

    private void numKills_ValueChanged(object sender, EventArgs e)
    {
        Player aNewStruct = new Player(5);
        aNewStruct = (Player)GameDB[currentEntryShown];
        aNewStruct.killsNumber[tabMatches.SelectedIndex] = (int)numKills.Value;
        GameDB[currentEntryShown] = aNewStruct;
    }

    private void numDeaths_ValueChanged(object sender, EventArgs e)
    {
        Player aNewStruct = new Player(5);
        aNewStruct = (Player)GameDB[currentEntryShown];
        aNewStruct.deathsNumber[tabMatches.SelectedIndex] = (int)numDeaths.Value;
        GameDB[currentEntryShown] = aNewStruct;
    }

    private void numAssists_ValueChanged(object sender, EventArgs e)
    {
        Player aNewStruct = new Player(5);
        aNewStruct = (Player)GameDB[currentEntryShown];
        aNewStruct.assistsNumber[tabMatches.SelectedIndex] = (int)numAssists.Value;
        GameDB[currentEntryShown] = aNewStruct;
    }

    private void numMinutes_ValueChanged(object sender, EventArgs e)
    {
        Player aNewStruct = new Player(5);
        aNewStruct = (Player)GameDB[currentEntryShown];
        aNewStruct.minutesNumber[tabMatches.SelectedIndex] = (int)numMinutes.Value;
        GameDB[currentEntryShown] = aNewStruct;
    }

    // =========================================================================
    // ================= HELPER METHODS FOR DISPLAYING DATA ====================
    // =========================================================================
    private void ShowData()
    {
        playerIdBox.Text = ((Player)GameDB[currentEntryShown]).uniquePlayerId[0].ToString();
        playerIgNameBox.Text = ((Player)GameDB[currentEntryShown]).playerIgName;
        contactStreetBox.Text = "" + ((Player)GameDB[currentEntryShown]).contactStreet;
        contactTownBox.Text = "" + ((Player)GameDB[currentEntryShown]).contactTown;
        contactPostcodeBox.Text = "" + ((Player)GameDB[currentEntryShown]).contactPostcode;
        contactEmailBox.Text = "" + ((Player)GameDB[currentEntryShown]).contactEmail;
        contactTelephoneBox.Text = "" + ((Player)GameDB[currentEntryShown]).contactTelephone;
        playerPictureBox.ImageLocation = ((Player)GameDB[currentEntryShown]).imagePath;

        numCS.Value = ((Player)GameDB[currentEntryShown]).csNumber[tabMatches.SelectedIndex];
        numKills.Value = ((Player)GameDB[currentEntryShown]).killsNumber[tabMatches.SelectedIndex];
        numDeaths.Value = ((Player)GameDB[currentEntryShown]).deathsNumber[tabMatches.SelectedIndex];
        numAssists.Value = ((Player)GameDB[currentEntryShown]).assistsNumber[tabMatches.SelectedIndex];
        numMinutes.Value = ((Player)GameDB[currentEntryShown]).killsNumber[tabMatches.SelectedIndex];

        int[] csNumberTF = ((Player)GameDB[currentEntryShown]).csNumber[tabMatches.SelectedIndex];
        int i = 0;
        while (i < 5)
        {
            if (csNumberTF[i] == 0)
            {
                int tabsLeft = tabMatches.TabCount;
                if(tabsLeft > 1)
                {
                    tabMatches.TabPages.Remove(tabMatches.SelectedTab);
                    tabsLeft--;
                }

            }
            i++;
        }            

    }
    private void UpdatePrevNextBtnStatus()
    {
        if (currentEntryShown > 0) showPreviousBtn.Enabled = true;
        else showPreviousBtn.Enabled = false;

        if (currentEntryShown < (numberOfEntries - 1)) showNextBtn.Enabled = true;
        else showNextBtn.Enabled = false;

        label1.Text = "Player ID";
        label3.Text = (currentEntryShown + 1) + " / " + numberOfEntries;
    }

    // =========================================================================
    // =============== HELPER METHODS FOR LOADING AND SAVING ===================
    // =========================================================================
    private void SaveData()
    {
        try
        {
            FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write);
            try
            {
                BinaryFormatter bf = new BinaryFormatter();
                bf.Serialize(fs, GameDB);
                MessageBox.Show("Data saved to " + filename, "FILE SAVE OK", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch
            {
                MessageBox.Show("Could not serialise to " + filename,
                                 "FILE SAVING PROBLEM", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
            fs.Close();
        }
        catch
        {
            MessageBox.Show("Could not open " + filename +
                            " for saving.\nNo access rights to the folder, perhaps?",
                             "FILE SAVING PROBLEM", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
        }
    }
    private void LoadData()
    {

        try
        {
            FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read);
            try
            {
                BinaryFormatter bf = new BinaryFormatter();
                GameDB = (ArrayList)bf.Deserialize(fs);

                currentEntryShown = 0;
                numberOfEntries = GameDB.Count;
            }
            catch
            {
                MessageBox.Show("Could not de-serialise from " + filename +
                                "\nThis usually happens after you changed the data structure.\nDelete the data file and re-start program\n\nClick 'OK' to close the program",
                                "FILE LOADING PROBLEM", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                fs.Close();             
                Environment.Exit(1);    
            }
            fs.Close();
        }
        catch
        {
            if (MessageBox.Show("Could not open " + filename + " for loading.\nFile might not exist yet.\n(This would be normal at first start)\n\nCreate a default data file?",
                                "FILE LOADING PROBLEM", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) == DialogResult.Yes)
            {
                Player aNewStruct = new Player(5);
                GameDB.Add(aNewStruct);
                numberOfEntries = 1;
                currentEntryShown = 0;
            }
        }

    }

    // =========================================================================
    // ====================== HELPER METHODS FOR SORTING =======================
    // =========================================================================
    private void sortToolStripMenuItem_Click(object sender, EventArgs e)
    {
        GameDB.Sort(new PlayerNameComparer());
        currentEntryShown = 0;
        ShowData();
        UpdatePrevNextBtnStatus();
    }
    public class PlayerNameComparer : IComparer
    {
        public int Compare(object x, object y)
        {
            return ((Player)x).playerIgName.CompareTo(((Player)y).playerIgName);
        }
    }

    // =========================================================================
    // ====================== MISC STUFF =======================================
    // =========================================================================
    private void aboutToolStripMenuItem_Click(object sender, EventArgs e)
    {

    }

    private void developerToolStripMenuItem_Click(object sender, EventArgs e)
    {
        MessageBox.Show("By Szymon Zmudzki: 13042432");
    }
    }
}

1 个答案:

答案 0 :(得分:0)

尝试更改此

int[] csNumberTF = ((Player)GameDB[currentEntryShown]).csNumber[tabMatches.SelectedIndex];
        int i = 0;
        while (i < 5)
        {
            if (csNumberTF[i] == 0)
            {
                int tabsLeft = tabMatches.TabCount;
                if(tabsLeft > 1)
                {
                    tabMatches.TabPages.Remove(tabMatches.SelectedTab);
                    tabsLeft--;
                }

            }
            i++;
        }  

使用for循环中的int []的csNumber

        int i = 0;
        while (i < 5)
        {
            if (((Player)GameDB[currentEntryShown]).csNumber[i] == 0)
            {
                int tabsLeft = tabMatches.TabCount;
                if(tabsLeft > 1)
                {
                    tabMatches.TabPages.Remove(tabMatches.SelectedTab);
                    tabsLeft--;
                }

            }
            i++;
        }  

要查找tabMatches.TabCount的值,请在运行程序时添加此行并在输出窗口中查看:(要回答您的问题,我认为TabCount从1开始。那是&#39; s任何.Count()调用整数数组的默认值。但这是确定的最佳方法。)

System.Diagnostics.Debug.WriteLine(tabMatches.TabCount);