【问题标题】:Display multiple content to textbox depending on which option was selected from combobox根据从组合框中选择的选项向文本框显示多个内容
【发布时间】:2011-12-20 01:28:12
【问题描述】:

-- 编辑--

值得指出。虽然有不同的家庭作业问题,但我发现我能够使用单独的对象作为条目(我可能应该这样做)。这将使解决我的最终问题变得更加容易。 This is a problem that might be usefull for me.

我正在尝试使用 foreach 循环将数据显示到文本框。数据应与组合框的选择相对应地显示。例如,如果我想显示 PC,我应该只看到用户名和密码,如果我添加另一个条目(例如网站),我应该看到以前的条目格式和带有字段 URL、用户名和密码的新条目。我已经尝试过 IF 语句 in my previous question 但似乎无法正常工作。

            StringBuilder sb = new StringBuilder();
            foreach (AddEntry list in addedEntry)
            {
                sb.AppendLine();
                sb.AppendLine("URL: " + list.URL);
                sb.AppendLine("Software Name: " + list.SoftwareName);
                sb.AppendLine("Serial Code: " + list.SerialCode);
                sb.AppendLine("User Name: " + list.UserName);
                sb.AppendLine("Password: " + list.Password);
                sb.AppendLine();
            }

            mainWindow.ChangeTextBox = sb.ToString();

问候。

【问题讨论】:

  • 请解释如何使用代码示例获取 AddEntry 列表
  • @UnhandledException: 我将一个对象 AddEntry 传递给 ArrayList 并使用来自文本框的输入。我已经更新了我的 OP。

标签: c# combobox foreach arraylist


【解决方案1】:
StringBuilder sb = new StringBuilder();
foreach (AddEntry list in addedEntry)
{
    sb.AppendLine();
    if (!string.IsNullOrEmpty(list.URL))
    sb.AppendLine("URL: " + list.URL);
    if (!string.IsNullOrEmpty(list.SoftwareName))
    sb.AppendLine("Software Name: " + list.SoftwareName);
    if (!string.IsNullOrEmpty(list.SerialCode))
    sb.AppendLine("Serial Code: " + list.SerialCode);
    if (!string.IsNullOrEmpty(list.UserName))
    sb.AppendLine("User Name: " + list.UserName);
    if (!string.IsNullOrEmpty(list.Password))
    sb.AppendLine("Password: " + list.Password);
    sb.AppendLine();
}

mainWindow.ChangeTextBox = sb.ToString();

第二个选项

在 AddEntry 类中添加如下方法

  public override string ToString() 
  {
    StringBuilder sb = new StringBuilder();
    sb.AppendLine();
    if (!string.IsNullOrEmpty(this.URL))
    sb.AppendLine("URL: " + list.URL);
    if (!string.IsNullOrEmpty(this.SoftwareName))
    sb.AppendLine("Software Name: " + this.SoftwareName);
    if (!string.IsNullOrEmpty(this.SerialCode))
    sb.AppendLine("Serial Code: " + this.SerialCode);
    if (!string.IsNullOrEmpty(this.UserName))
    sb.AppendLine("User Name: " + this.UserName);
    if (!string.IsNullOrEmpty(this.Password))
    sb.AppendLine("Password: " + this.Password);
    sb.AppendLine();
    return sb.ToString();
  }

然后你可以显示所有添加的条目如下

StringBuilder sb = new StringBuilder();
foreach (AddEntry entry in addedEntry)
{
    sb.Append(entry.ToString());
}

mainWindow.ChangeTextBox = sb.ToString();

【讨论】:

  • 如果我从一开始就知道这一点。我觉得复制 n 粘贴很糟糕,但你确实使用了 OOP,这是一个值得回答的问题。
  • 只是为了接近点。我不会学到我从未经历过的东西。再次感谢您。
【解决方案2】:
   StringBuilder sb = new StringBuilder();
    foreach (AddEntry list in addedEntry)
    {
        sb.AppendLine();
        if (!string.IsNullOrEmpty(list.URL))
             sb.AppendLine("URL: " + list.URL);
        if (!string.IsNullOrEmpty(list.SoftwareName))
             sb.AppendLine("Software Name: " + list.SoftwareName);
        if (!string.IsNullOrEmpty(list.SerialCode))
             sb.AppendLine("Serial Code: " + list.SerialCode);
        if (!string.IsNullOrEmpty(list.UserName))
             sb.AppendLine("User Name: " + list.UserName);
        if (!string.IsNullOrEmpty(list.Password))
             sb.AppendLine("Password: " + list.Password);
        sb.AppendLine();
    }

    mainWindow.ChangeTextBox = sb.ToString();

编辑:我使用了 UnhandledException 的版本,因为它比我的解决方案更易读(在大多数情况下,条件运算符通常不受欢迎)。

我还想指出,使用自动属性可以更轻松地编写您的 AddEntry 类(假设您使用的是 .NET 3.0+)。

见:

namespace Store_Passwords_and_Serial_Codes
{
    class AddEntry
    {
        // Auto properties make this class a lot easier to read.
        public string type { get; set; }
        public string url { get; set; }
        public string softwareName { get; set; }
        public string serialCode { get; set; }
        public string userName { get; set; }
        public string password { get; set; }

        // Non-default constructor.
        public AddEntry(string type, string url, string softwareName, string serialCode, string userName, string password)
        {
            this.type = type;
            this.url = url;
            this.softwareName = softwareName;
            this.serialCode = serialCode;
            this.userName = userName;
            this.password = password;
        }
    }
}

最后,正如您所说,重要的是不要为一种条目类型保存属于另一种条目类型的信息(例如,您不应该将 URL 保存到 PC 条目类型中,因为这没有任何意义到)。使用更强的类型对象(即 WebPassword、PCPassword、SoftwareSerialCode 等),整个解决方案可能会更好。这些都可以从基类(Entry 或类似的东西)继承,以便更容易地强类型列表。

例如:

class Entry { }

class PCPassword : Entry
{
    string userName { get; set; }
    string password { get; set; }

    public PCPassword(string uName, string pass)
    {
        this.userName = uName;
        this.password = pass;
    }

    public override string ToString()
    {
        StringBuilder sb = new StringBuilder();
        sb.AppendLine();
        sb.AppendLine("User Name: " + this.userName);
        sb.AppendLine("Password: " + this.password);
        sb.AppendLine();
        return sb.ToString();
    }
}

然后你会在你的代码中这样引用它:

 private void btnAddEntry_Click(object sender, EventArgs e)
 {
     // Making sure that type is selected.
     if (cmbType.SelectedIndex != -1)
     {
         if (cmbType.SelectedIndex == 0)
         {
             if(textUserName.Text == String.Empty || textPassword.Text == String.Empty)
                    MessageBox.Show("Please fill all the fields!", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
             else
             {
                 addedEntry.Add(new PCPassword(textUserName.Text, textPassword.Text));
                 MessageBox.Show("Entry was successfully added!", "Entry Added!", MessageBoxButtons.OK, MessageBoxIcon.Information);
                 ClearFields();
             }
         }

         // etc, etc

         // Print our items
         StringBuilder sb = new StringBuilder();
         foreach (Entry item in addedEntry)
         {
             sb.Append(item.ToString());
         }

         mainWindow.ChangeTextBox = sb.ToString();
     }
 }

只是想我会把它扔在那里;)

【讨论】:

  • 清楚,不清楚,我看到你的消息了。让我稍微调整一下,我会回复的。
  • 好的。这将是完美的。但是当添加第一个条目时,它会显示所有字段。另一件事 "\n" 必须改为 Environment.NewLine。我该如何解决第一个条目的问题?
  • 好吧,没关系。我已经声明了所有变量以便于输入。谢谢!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-10
  • 1970-01-01
相关资源
最近更新 更多