迭代pdf c#class的复选框

时间:2018-01-20 00:26:02

标签: c# class checkbox foreach iteration

所以我对之前的迭代有了很好的帮助,效果很好!

我尝试使用以下信息修改我的代码 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;

2 个答案:

答案 0 :(得分: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;
}

我认为你可以使用LINQ查询将CheckBoxes映射到KeyValuePairs来改进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");
}

答案 1 :(得分:0)

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;
    // ...
}