在Visual Studio WinForms中,如何允许用户修改CSV文本文件中的特定值?

r6hnlfcb  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(113)

我正在使用Visual Studio WinForms开发一个“花名册”应用程序,其中花名册(人员列表)从(CSV)文本文件中读取。文本文件中每个人有11个值。(姓名,描述等)。我设置了应用程序,以便当表单加载时,此文本文件中的所有Name值都会加载到列表框中。
x1c 0d1x的数据
然后,当用户点击列表框中的人员时,表单上的标签会更新,以与所选人员的值相对应。(例如,用户点击“人员1”,“描述”标签会更改为该特定人员的描述)。
现在我想做的是当用户点击描述标签时,会显示一个输入框,用户可以输入一个新的描述。在输入框中添加新的描述之后,这个人的描述值就会在文本文件中被修改。我使用的代码没有错误,但是文本文件没有改变以更新新的“描述”。
我对C#很陌生,所以希望这是有意义的。
多谢了!

private void lblDescription_Click(object sender, EventArgs e)
 {
     string input = Interaction.InputBox("Enter a new description", "Enter a value", personDescription, 0, 0);

     string idToFind = "Person 1";
     string newDescription = input;
     
    string line;
    while ((line = roster.ReadLine()) != null)
     {
         string[] words = line.Split(',');

         for (int i = 0; i < words.Length; i++)
         {
             if (words[i] == idToFind)
             {
                 //words[i + 1] = newDescription;
                 words[i] = String.Format("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11}", personName,newDescription,personDrawValue, personInRingAbility, personMicSkills, personCharisma, personCondition, personAlignment, personWeight, personGender, personMorale, personRingStyle);
                 break;

             }
            File.WriteAllLines(roster2,words);
         }
     }

字符串

6qqygrtg

6qqygrtg1#

您的帖子谈到了数据的加载和保存(Serialization)但这听起来并不像是造成麻烦的根本问题。相反,当你输入一些描述文本时,会有一个断开,当你保存时,它并没有完全连接回你实际保存的对象。如果你还没有听说过Binding这个术语,你很快就会听说了。顾名思义,它意味着UI控件(类似于文本编辑器)和作为其目标的数据被连接以相互通知。通过这种方式同步,下面的代码将在ListBox中连接更改以通知其他控件,而无需手动编写所有同步。


的数据
你可以说你的应用程序根本不处理“文件”。它处理的是一个花名册,可以抽象为BindingList<Person>,如果它不是现成的,它将是ListBoxDataSource。你将一个人描述为“一组11个值”,但我们真的想确定这一点。

class Person
{
    public string Name { get; set; } = string.Empty;
    public string Description { get; set; } = string.Empty;

    [Description("In Ring Ability")]
    public int InRingAbility { get; set; }

    [Description("Draw Value")]
    public int DrawValue { get; set; }
    public int Charisma { get; set; }
    public int Condition { get; set; }
    public string Alignment { get; set; } = string.Empty;
    public int Weight { get; set; }
    public string Gender { get; set; } = string.Empty;
    public int Morale { get; set; }

    [Description("Ring Style")]
    public string RingStyle { get; set; } = string.Empty;

    [Description("Mic Skills")]
    public int MicSkills { get; set; }
}

字符串
ListBox将管理一个Person对象的列表,其中Name是列表中显示的属性。至于文本文件,这里的目标是以某种方式将其转换为内存中的活生生的List,我提到Json的原因是为了方便ListBox现在显示了5个名字,listBox.SelectedValue是一个Person而不是一个字符串。

public partial class MainForm : Form
{
    public MainForm() => InitializeComponent();

    string _filePath = Path.Combine(
        Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
        Assembly.GetEntryAssembly().GetName().Name,
        "roster.json"
        );
    BindingList<Person> Persons { get; set; }
    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        if(!File.Exists(_filePath))
        {
            makeNewFile();
        }
        // Load the json (or other format) file into a List in memory
        var json = File.ReadAllText(_filePath);
        Persons = JsonConvert.DeserializeObject<BindingList<Person>>(json);

        listBox.DataSource = Persons;
        listBox.DisplayMember = "Name";
        .
        .
        .
    }
}


向UI控件添加一些绑定将使列表框中的选择更改自动反映在这些控件中。

.
    .
    .
    labelName.DataBindings.Add("Text", listBox.DataSource, "Name");

    // Two-way binding for Description
    textBoxDescription.DataBindings.Add(
        "Text", 
        listBox.DataSource, 
        "Description",
        true, 
        DataSourceUpdateMode.OnPropertyChanged);
    .
    .
    .


作为一个建议,我个人进行描述编辑的方式是通过双击将描述“标签”变成一个可编辑的控件。


.
    .
    .    
    textBoxDescription.MouseDoubleClick += (sender, e) =>
    {
        if(textBoxDescription.ReadOnly)
        {
            textBoxDescription.ReadOnly = false;
            textBoxDescription.BackColor = Color.White;
            textBoxDescription.ForeColor = Color.Black;
        }
    };
    textBoxDescription.KeyDown += (sender, e) =>
    {
        switch(e.KeyData)
        {
            case Keys.Enter:
                e.Handled = e.SuppressKeyPress = true;
                if(!textBoxDescription.ReadOnly)
                {
                    textBoxDescription.ReadOnly = true;
                    textBoxDescription.BackColor = Color.FromArgb(0,0,192);
                    textBoxDescription.ForeColor = Color.White;
                    var json = JsonConvert.SerializeObject(Persons, Formatting.Indented);
                    File.WriteAllText(_filePath, json);
                }
                break;
        }
    };
    .
    .
    .


当您重新加载应用程序时,更改将以您预期的方式保持不变。

相关问题