【问题标题】:Iteration of checkboxes to pdf c# class将复选框迭代到pdf c#类
【发布时间】:2018-01-20 00:26:01
【问题描述】:

所以我在之前的迭代中得到了一些很棒的帮助,效果很好!

我尝试使用以下信息修改我的代码 Get property value from string using reflection in C#

但是要么我弄错了,要么我的课程设置方式无法使用该方法。

我使用了代码

foreach (var checkbox in this.Controls.OfType<CheckBox>())
        {
            pdfFormFields.SetField(checkbox.Name, checkbox.Checked ? "Yes" : "No");
        }

现在效果很好,我被告知要使用一个类来使其更通用,我的类是

public class Entries
{
    ///Some other Values
    public string ColourW;
    public bool CheckBox1 { get; set; }
    public bool CheckBox2 { get; set; }
    public bool CheckBox3 { get; set; }
    public bool CheckBox4 { get; set; }
    public bool CheckBox5 { get; set; }
    public bool CheckBox6 { get; set; }
    public bool CheckBox7 { get; set; }
    public bool CheckBox8 { get; set; }
    public bool CheckBox9 { get; set; }
}

我需要一个像上面这样的 foreach 语句,但是要在类中将信息设置为类似这样的数据,但是我得到一个标识符预期的错误。

foreach (var checkbox in this.Controls.OfType<CheckBox>())
        {
            Data.(checkbox.Name, checkbox.Checked ? "Yes" : "No");
        }

非常感谢您的帮助,非常感谢您帮助解释代码的工作原理!

对不起,我是硬件人!

编辑

多亏@Furkan Kambay 设法让复选框进出课堂,所以解决了大部分问题,但由于某种原因,PDF 上的复选框不会设置为相同的状态?

更长的解释,类设置表单在调用 pdfFormFileds("Textx", Entries.ColourW); 时工作正常所有组合框和文本字段工作正常但是 PDF 复选框在使用代码时不会改变状态,我正在使用 iTextSharp 库

foreach (var box in Entries.CheckBoxes) 
            {
                pdfFormFields.SetField(box.Key, box.Value ? "Yes" : "No");
             }

PDF 设置

string pdfTemplate = @"C:\Testing Templates\Pre V-Change Head Test Certificate Template.pdf";
            string newFile = @"c:\temp\PDF\" + Entries.SerialNumber + " " + Entries.TestedWithCal + " Pre V-Change Head Test Certificate.pdf";
            string Created;

            PdfReader pdfReader = new PdfReader(pdfTemplate);
            PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileStream(newFile, FileMode.Create));
            AcroFields pdfFormFields = pdfStamper.AcroFields;

【问题讨论】:

  • 所以 checkbox.Name 将类似于 "CheckBox1"/2/3 等,并且您想在您的类中找到具有该名称的变量并将其分配给 true 或 false,我在正确的道路?
  • 就是这样!表单上的 Checkbox1 需要将类中的 Chekbox1 设置为相同的状态
  • 可能是,但如果可能的话我不想使用反射。就像我说的那样,我是一个硬件人,无法做出正面或反面
  • 名称是否始终保持不变?
  • 它将永远是 checkbox1 - checkbox1 等

标签: c# class checkbox foreach iteration


【解决方案1】:

将您的班级编辑成这样:

public static class Entries
{
    // ... all the other fields with static keyword
    public static string ColourLRB;
    public static string ColourW;
    public static Dictionary<string, bool> CheckBoxes { get; } = new Dictionary<string, bool>(); // no set, so you can only modify this. 
}

然后:

foreach (var checkbox in this.Controls.OfType<CheckBox>())
{
    CheckBoxes[checkbox.Name] = checkbox.Checked;
}

我认为您可以通过将 CheckBoxes 映射到 KeyValuePairs 的 LINQ 查询来改进 foreach 语句。如果你愿意,我可以编辑答案。

编辑,使用 LINQ 映射:(替换整个 foreach)

var boxes = this.Controls.OfType<CheckBox>();
CheckBoxes = boxes.ToDictionary(b => b.Name, b => b.Checked);

edit2,重新设置

foreach(var box in Entries.CheckBoxes) // this is using static. For Singleton it would be "var box in Entries.Instance.CheckBoxes"
{
    pdfFormFields.SetField(box.Key, box.Value ? "Yes" : "No");
}

【讨论】:

  • 请继续
  • 类文件与表单代码分开,Dictionary 在放入表单时出错,说明它需要 2 个参数。另外我需要将条目传递给另一个表单上的子例程我可以这样做并保持静态吗?
  • @RhysClarke 您不必弄乱表格。只是条目类。只需像我在这个答案中所做的那样修改 Entries 类。无论如何,您不能将字典放入表单中。
  • 对于静态的东西,你可以把它做成Singleton。谷歌一下。
  • @RhysClarke 你解决问题了吗?我给了你3个有效的答案。答案长度应为 3 个字母,以“y”开头,以“s”结尾,还包含“e”。
【解决方案2】:
var entries = new Entries(); // looks to me like this class and its members should be static, no?
foreach (var checkbox in this.Controls.OfType<CheckBox>())
{
    if(checkbox.Name == "CheckBox1") entries.CheckBox1 = checkbox.Checked;
    else if(checkbox.Name == "CheckBox2") entries.CheckBox2 = checkbox.Checked;
    else if(checkbox.Name == "CheckBox3") entries.CheckBox3 = checkbox.Checked;
    // ...
}

【讨论】:

  • 这行得通,但我已经可以像这样设置它们了。我想我的另一个问题是我可以在不参考每个框的情况下做到这一点吗?静态是什么意思?
  • 另外一种方法是使用反射。您可以用一个 Dictionary&lt;string, bool&gt; 替换所有属性并在 foreach 中执行 dictionary[checkbox.Name] = checkbox.Checked。
  • 静态我的意思是如果你不需要实体类的多个实例,你应该把它设为static,这样你就可以像这样访问它的成员:Entities.CheckBox1
  • 你能告诉我如何使用反射吗,这是真的。
  • @RhysClarke 我已经提供了反射解决方案,这是您问题的链接。我用字典解决方案提交了另一个答案。
猜你喜欢
  • 2010-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多