【问题标题】:Adding info from 3 textboxs into a jagged array to display in a listbox将来自 3 个文本框的信息添加到锯齿状数组中以显示在列表框中
【发布时间】:2018-10-14 04:35:04
【问题描述】:

The Form layout

我正在尝试创建一个 Windows 窗体,允许用户以字符名称、强度和敏捷度的形式将值输入到锯齿状数组中。一旦他们将这些值输入到文本框中,就必须将其保存,以便用户可以查看使用列表框输入的字符的信息

    public Form1()
    {
        InitializeComponent();
        String[][] Arr = new String[3][];
        Arr[0] = new String[20];
        Arr[1] = new String[20];
        Arr[2] = new String[20];

    }

所以我创建了字符串供用户输入 3 个属性的值。现在我不确定在哪里实际添加代码(以及代码是什么)。我应该放一行如 Arr[0] = NameTxtbox.Text

【问题讨论】:

  • 您只是在问如何将点击处理程序分配给按钮?双击表单编辑器中的按钮。我想一些关于 WinForms 开发的简短教程在这里可能会有很长的路要走。另请注意,多个值数组不能很好地替代单个自定义对象数组。
  • 这里是文档:msdn.microsoft.com/en-us/library/… 你可以在TextChanged 事件上添加事件监听器
  • 我知道如何将点击处理程序分配给按钮,但我不确定如何将 3 个文本框中的信息保存到数组中,在 Name 的意义上必须保存到 Arr [0] 然后必须将第二个文本框中的强度保存到 Arr[1]
  • @JaceYatrakos:嗯,Arr[0] 本身就是一个数组,所以你不能在其中保存一个字符串。您想在奇怪的数据结构中的哪个位置保存该值?您是要保存到Arr[0][0] 吗?如果您只是为您的数据创建一个自定义对象并维护该对象的数组(或通用列表),这可能会很多轻松。
  • @David 对不起,我真的不确定你的意思,我还在尝试掌握 C# 表单的窍门,所以请原谅我。但是你是说我应该做的是使用 Textbox.TextChanged 行将文本框中的信息存储到单个数组中?

标签: c#


【解决方案1】:

在你的保存按钮处理程序中添加这个

这条线:

string Info = textBox1.Text + " - " + textBox2.Text + " - " + textBox3.Text;

-将用户输入的所有字符串连接成一个字符串作为间隔。

还有这一行

listBox1.Items.Add(Info);

将字符串添加到列表框。

编辑:

这就是您将它们存储在数组中的方式。

string[] array = new[]{textBox1.Text , textBox2.Text , textBox3.Text};

【讨论】:

    【解决方案2】:

    不要使用多个值数组代替单个对象数组。

    考虑一个简单的对象:

    public class Character
    {
        public string Name { get; set; }
        public string Dexterity { get; set; }
        public string Strength { get; set; }
    }
    

    现在,如果您希望表单维护Character 对象列表,请在表单中创建类级属性:

    private List<Character> Characters { get; set; } = new List<Character>();
    

    现在,每当您从输入中保存字符时(例如单击表单上的“保存”按钮时),您只需将其添加到列表中:

    Characters.Add(new Character
    {
        Name = NameTxtbox.Text,
        Dexterity = DexterityTxtbox.Text,
        Strength = StrengthTxtbox.Text
    });
    

    因此,您不必尝试维护由单个值组成的复杂数组,而是拥有一个简单的有意义对象的集合。你可以bind your ListBox 到同一个对象集合。

    【讨论】:

    • 所以我没有涉及对象创建,所以我将它们拼凑在一起,所以让我确保我理解正确:使用变量名称、敏捷度和强度创建对象角色,然后是文本框中的值存储在名称、敏捷度和强度中,然后每当我使用保存按钮保存角色时,它就会调用角色对象的新实例以允许另一个条目进入列表?
    • @JaceYatrakos:这是大意,是的。基本上任何时候你有多个值在概念上描述一个 thing 那么 thing 本身就是某种对象。这基本上是重构模式 Replace Array With Object:refactoring.com/catalog/replaceArrayWithObject.html 的一种变体,您会发现将值逻辑分组为有意义的对象要容易得多。为这些对象赋予有意义的名称的改进语义使您的代码更易于阅读和维护。
    • 好的,所以我对您的解决方案只有一个问题。我是在公共表单内部还是外部创建公共类字符。然后我把其余的像 Character.Add 放在 Character 类中
    • @JaceYatrakos:我会在外面创建它,把它作为一个单独的关注点。随着您的逻辑增长,这将成为您“域”中的“模型”。您可能有自定义对象,例如 CharacterWeaponAttackType 或您正在构建的系统中的任何东西。理想情况下,该领域的大部分逻辑都属于模型,而 UI(表单)只是调用该逻辑。拥有一个名为“Models”的文件夹并将您的自定义内容放在那里会是一个好的开始。
    • 所以当我尝试添加 Character.Add 时出现错误,应该这样写,Character.Add(new Character) { Name = NameTxt.Text;敏捷度 = DexTxt.Text;强度 = StrTxt.Text;这也应该添加到 Character 类中
    【解决方案3】:

    正如@David 指出的那样,最好的办法是学习一点有关 winform 的知识。

    这里是一些微软的文档:https://msdn.microsoft.com/en-us/library/system.windows.forms.textbox(v=vs.110).aspx

    文本框向TextChanged 触发事件,您可以“监听”这些事件以执行您自己的代码:https://msdn.microsoft.com/en-us/library/system.windows.forms.control.textchanged(v=vs.110).aspx

    textBox = new TextBox()
    textBox.TextChanged += () => {
       // your code here.
       var input = textBox.Text;
       Arr[1] = input.ToCharArray();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-17
      • 2014-04-21
      • 2023-03-04
      相关资源
      最近更新 更多