【问题标题】:How to return items from a list according to their respective checked box in checkedlistbox C#?如何根据checkedlistbox C#中各自的复选框从列表中返回项目?
【发布时间】:2021-02-12 23:44:48
【问题描述】:

我在另一个答案中的第一个 C# 应用程序上取得了进展,但我仍然无法理解下一部分。

我有一个 JSON 文件,其中包含一个包含我的数据的数组。我的应用程序从包含数组的 JSON 文件中获取信息,并使用每个结果的“名称”填充我的 checklistbox1。当您单击选中列表框1 中的任何项目(未选中)时,它会在相邻的富文本框1 中显示特定结果的信息(名称、风险、描述、定义为“CompleteFinding”的推荐)。这一切都很棒。

我现在要做的是获取在我的checkedlistbox1 中选中的任何项目的CompleteFinding 并用它做我想做的事情,即变量或要在文本框中引用的东西,或者稍后在单击Button1 时在其他地方输出等等。我尝试使用“checkedlistbox1.SelectedItems”并收到关于转换为我的结果类型的错误。我还尝试使用 foreach 循环,它只返回检查的最后一项。我需要在单击 Button1 时使用每个选中项目的 CompleteFinding。

JSON 文件示例内容:

[
 {
   "Name": "Test Name 1",
   "Risk": "Low",
   "Details": "Detailed description",
   "Recommendation": "Recommended action"
 },
 {
   "Name": "Test Name 2",
   "Risk": "Low",
   "Details": "Detailed description",
   "Recommendation": "Recommended action"
 }
]

代码

public partial class Form1 : Form
{
 public class Findings
 {
  [JsonProperty("Name")]
  public string Name { get; set; }
 
  [JsonProperty("Risk")]
  public string Risk { get; set; }

  [JsonProperty("Details")]
  public string Details { get; set; }

  [JsonProperty("Recommendation")]
  public string Recommendation { get; set; }
  
  public string CompleteFinding
  {
   get
   {
    return "Name:" + "\n" + Name + "\n" + "\n" + "Risk:" + "\n" + Risk + "\n" + "\n" + "Details:" + "\n" + Details + "\n" + "\n" + "Recommendation:" + Recommendation + "\n";
   }
  }
}
 
 public Form1()
 {
  InitializeComponent();

  var json = JsonConvert.DeserializeObject<List<Findings>>(File.ReadAllText(@"findings-array.json"));
  checkedListBox1.DataSource = json;
  checkedListBox1.DisplayMember = "Name";
 }

 private void Button1_Click(object sender, System.EventArgs e)
 {
  //would like to be able to use the CompleteFinding of each checkeditem here.
 }

 private void checkedListBox1_SelectedIndexChanged(object sender, EventArgs e)
 {
  //This populates a single Finding's CompleteFinding to the richtextbox.
  richTextBox1.Text = ((Findings)checkedListBox1.SelectedItem).CompleteFinding;
 }
}

【问题讨论】:

    标签: c#


    【解决方案1】:

    大概是这样的吧?

    private void Button1_Click(object sender, System.EventArgs e) {
        richTextBox1.Text = null; // clear out your results first
        var sb = new StringBuilder();
        foreach (var item in checkedListBox1.SelectedItems) {
            var selected = (Findings)item;
            sb.AppendLine(selected.CompleteFinding);
            sb.AppendLine(); // adds a blank line
        }
        richTextBox1.Text = sb.ToString();
    }
    

    从您下面的评论中,听起来您的 ListView 是为了使用物理复选框而编写的。您可能应该在最初的问题中提到这一点。

    要编写代码使其仅查看带有复选标记的 ListViewItems,请使用以下代码:

    private void Button1_Click(object sender, System.EventArgs e) {
        richTextBox1.Text = null; // clear out your results first
        var sb = new StringBuilder();
        foreach (ListViewItem item in checkedListBox1.Items) {
            if (item.Checked) {
                var find = item.Tag as Finding;
                if (find != null) {
                    sb.AppendLine(find.CompleteFinding);
                    sb.AppendLine(); // adds a blank line
                }
            }
        }
        richTextBox1.Text = sb.ToString();
    }
    

    我不知道 JSON 如何附加到单个 ListViewItems。在上面的代码中,我展示了它从 Tag 字段中提取数据,但它只有在你在那里编写时才会出现。编写代码的方法有很多。

    我一直假设这是一个基本的 Windows 窗体应用程序。 Windows 窗体的 ListView 控件不同于 Web 应用程序可用的控件。

    【讨论】:

    • 这看起来可以将一个 CompleteFinding 添加到richTextBox1,但由于某种原因,它只添加了最后一个检查的项目,而不是所有检查项目的 CompleteFinding。
    • 所以您的物品上有实体复选框。大多数人都想检查选中的项目。在您的情况下,您需要将代码修改为checkedListBox1 中的所有项目,阅读以查看该项目是否已选中,并将其附加到 StringBuilder。你能弄清楚那部分吗?
    • 我上面贴的代码是整个应用程序。我不太了解您对 ListView 的意思,但每个复选框都是从作为数据源的 json 填充的,而 DisplayMember 是 JSON 数组中每个结果的名称。目前,这已经可以提取一个结果并且它与“CompleteFinding”相关联,但我无法让它为选中的列表框中的每个项目提取 CompleteFinding。
    猜你喜欢
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多