Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.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# 使用下拉菜单索引删除列表成员就是删除保存数据中的整个列表_C#_List_User Interface_Unity3d_Drop Down Menu - Fatal编程技术网

C# 使用下拉菜单索引删除列表成员就是删除保存数据中的整个列表

C# 使用下拉菜单索引删除列表成员就是删除保存数据中的整个列表,c#,list,user-interface,unity3d,drop-down-menu,C#,List,User Interface,Unity3d,Drop Down Menu,我正在尝试为Unity中的android应用程序粗略实现用户名数据保存。这个应用程序将不会被部署,我不需要担心用户名的密码,所以我只是使用持久数据路径来保存一个文本文件 输入的用户名将添加到字符串列表中,然后用于填充我的UI中的下拉菜单 我能够很好地创建文本文件,并保存到其中,然后从中加载。但是,我正在尝试实现一个delete函数,该函数允许用户删除他们不想再使用的用户名,它应该从字符串列表中删除用户名,从下拉菜单中删除用户名,并调用“Save”函数将新列表重新保存到同一文本文件中 目前,我让用

我正在尝试为Unity中的android应用程序粗略实现用户名数据保存。这个应用程序将不会被部署,我不需要担心用户名的密码,所以我只是使用持久数据路径来保存一个文本文件

输入的用户名将添加到字符串列表中,然后用于填充我的UI中的下拉菜单

我能够很好地创建文本文件,并保存到其中,然后从中加载。但是,我正在尝试实现一个delete函数,该函数允许用户删除他们不想再使用的用户名,它应该从字符串列表中删除用户名,从下拉菜单中删除用户名,并调用“Save”函数将新列表重新保存到同一文本文件中

目前,我让用户从下拉菜单中选择有问题的用户名,然后按下“删除”按钮,该按钮应使用下拉菜单的索引,并使用“RemoveAt”功能删除字符串列表中的相应成员

但是,这似乎删除了整个列表,打开保存文本文件时,它现在为空。我相信我删除列表成员的方式有问题,或者应用程序重新保存新列表的方式有问题

public class SignInManager : MonoBehaviour {

    List<string> menuOptions = new List<string>();

    //USER INPUT
    public InputField newUserName;
    public Dropdown selectedUsername;
    public string userName;
    public int dropDownOption;

    //SAVING
    FileInfo f;


// Use this for initialization
void Start () {

    f = new FileInfo(Application.persistentDataPath + "save.txt");

    //Load existing username options here
    if (f.Exists) 
    {
        Load();
    }

    Save();

    Load();
}

//When the sign-in button is clicked
public void OnClick()
{

    if (newUserName.text != "" ^ selectedUsername.value != 0)
    {
        //Save entered user data, later export to desired location
        if (newUserName.text != "")
        {
            userName = newUserName.text;

            selectedUsername.AddOptions(new List<string> { userName }); //AddOptions must take a list as parameter, but this is just a list of one each time

            menuOptions.Add(userName);

            Save();
            Load();

            //Save data to text file here

            //Set current username to entered one

        }
        else if(selectedUsername.value != 0)
        {
            dropDownOption = selectedUsername.value; //Set current username to selected one
        }
    }

//When the user signs out
public void OnReturnClick()
{
    newUserName.text = "";
    selectedUsername.value = 0;

    userName = "";
    dropDownOption = 0;
    }

}

public void DeleteOption()
{
    if (selectedUsername.value != 0)
    {
        Debug.Log("Removing: " + selectedUsername.value);

        //menuOptions.RemoveAt(selectedUsername.value);

        selectedUsername.options.RemoveAt(selectedUsername.value);

        selectedUsername.value = 0;

        Save();
        Load();

    }
}

void Save()
{
    StreamWriter w;
    if (!f.Exists)
    {

        w = f.CreateText();

        for (int i = 0; i < menuOptions.Count; i++)
        {
            w.WriteLine(menuOptions[i]);
        }

    }
    else
    {
        f.Delete();
        w = f.CreateText();

        for (int i = 0; i < menuOptions.Count; i++)
        {
            w.WriteLine(menuOptions[i]);
        }

    }

    w.Flush();
    w.Close();

}

void Load()
{
    if (f.Exists && selectedUsername != null) //don't know why selectedUsername sometimes comes up as null, but that additional condition was needed
    {
        selectedUsername.ClearOptions();
        selectedUsername.AddOptions(new List<string> { "" });

        StreamReader r = File.OpenText(Application.persistentDataPath + "save.txt");
        string line;

        while ((line = r.ReadLine()) != null)
        {
            menuOptions.Add(line);
            selectedUsername.AddOptions(new List<string> { line });

        }

        r.Close();
    }

}


}


}
公共类SignInManager:MonoBehavior{
列表菜单选项=新建列表();
//用户输入
公共输入字段newUserName;
公共下拉列表selectedUsername;
公共字符串用户名;
公共int下拉选项;
//拯救
文件信息f;
//用于初始化
无效开始(){
f=新文件信息(Application.persistentDataPath+“save.txt”);
//在此处加载现有用户名选项
如果(f.Exists)
{
加载();
}
Save();
加载();
}
//单击“登录”按钮时
公共void OnClick()
{
如果(newUserName.text!=“^selectedUsername.value!=0)
{
//保存输入的用户数据,稍后导出到所需位置
如果(newUserName.text!=“”)
{
userName=newUserName.text;
selectedUsername.AddOptions(新列表{userName});//AddOptions必须使用列表作为参数,但每次只能使用一个列表
菜单选项。添加(用户名);
Save();
加载();
//在此处将数据保存到文本文件
//将当前用户名设置为输入的用户名
}
else if(selectedUsername.value!=0)
{
dropDownOption=selectedUsername.value;//将当前用户名设置为所选用户名
}
}
//当用户注销时
返回时公共作废单击()
{
newUserName.text=“”;
selectedUsername.value=0;
用户名=”;
dropdownpoption=0;
}
}
公共void DeleteOption()
{
如果(selectedUsername.value!=0)
{
Log(“删除:”+selectedUsername.value);
//menuOptions.RemoveAt(selectedUsername.value);
selectedUsername.options.RemoveAt(selectedUsername.value);
selectedUsername.value=0;
Save();
加载();
}
}
作废保存()
{
作者w;
如果(!f.Exists)
{
w=f.CreateText();
for(int i=0;i
所以我自己也试过了。首先,我不明白你是如何让整个名单消失的。当我在Unity中测试这一点时,这并没有发生在我身上。也许当你的文件消失时,你正在路径
C:\Users\Andy\AppData\LocalLow\{companyName}\{projectName}\save.txt检查它。如果你这样做,并且出于某种原因你在该位置有一个文件,那么该文件应该是空的。您将文件列为
Application.persistantDataPath+“save.txt”
,并且Application.persistantDataPath不会返回结尾。因此,无论您认为这是否可行,您的文件路径最好是
Application.persistantDataPath+@“\save.txt”

第二,虽然我没有看到整个列表出现,但列表和文件不会更新。这是因为你正在做

        //menuOptions.RemoveAt(selectedUsername.value);

    selectedUsername.options.RemoveAt(selectedUsername.value);

    selectedUsername.value = 0;
而save函数不执行w.WriteLine(菜单选项[i])您正在更改选项,然后试图从错误列表中保存。解决这个问题的简单方法是,看起来您第一次就做对了,取消注释
//menuOptions.RemoveAt(selectedUsername.value)
和remove
selectedUsername.options.RemoveAt(selectedUsername.value)毕竟,您的加载应该对下拉列表进行更改

您的负载也直接添加到列表中,因此每次调用它时,您的列表将越来越长。您的加载应该在添加到列表之前清除列表

另外,我注意到在您的save方法中,您将名称直接添加到savelist和下拉列表中。这是在下拉列表中看到更改的唯一原因,因为加载没有运行,因为f变量仍然认为文件不存在。而且你的文件修改都是附加的,所以奇怪的事情发生在文件e上
    void Start()
{

    f = new FileInfo(Application.persistentDataPath + @"\save.txt");

    //Load existing username options here
    if (f.Exists)
    {
        Load();
    }

    Save();

    Load();
}

    void Save()
{
    StreamWriter w = new StreamWriter(Application.persistentDataPath + @"\save.txt", false);

        for (int i = 0; i < menuOptions.Count; i++)
        {
            w.WriteLine(menuOptions[i]);
        }

    w.Close();

}


    void Load()
{
    f = new FileInfo(Application.persistentDataPath + @"\save.txt");
    if (f.Exists && selectedUsername != null) //don't know why selectedUsername sometimes comes up as null, but that additional condition was needed
    {
        selectedUsername.ClearOptions();
        selectedUsername.AddOptions(new List<string> { "" });

        StreamReader r = new StreamReader(Application.persistentDataPath + @"\save.txt");
        string line;

        menuOptions.Clear();

        while ((line = r.ReadLine()) != null)
        {
            menuOptions.Add(line);
            selectedUsername.AddOptions(new List<string> { line });

        }
        selectedUsername.RefreshShownValue();
        r.Close();
    }

}