C# مربعات الاختيار - هل يمكنني تنظيف هذا؟
-
05-07-2019 - |
سؤال
هذه الوظيفة تسمى من form_onload. أقرأ بشكل أساسي السجل ، وأحدد مربعات الاختيار التي تم تحديدها ، ثم تعكس ذلك في واجهة المستخدم الرسومية.
هل هناك أي طريقة لتكثيف هذا وكتابة رمز أفضل؟ ماذا عن استخدام خاصية CheckState؟
شكرًا.
وودي
private void checkExcelSettings()
{
// Read what the values are for the checkboxes first and assign them to a string.
string _excelEnable = Convert.ToString(Registry.GetValue(@"HKEY_CURRENT_USER\Software\Mask Data\", "ExcelEnableHash", "Unchecked"));
string _excelSSN = Convert.ToString(Registry.GetValue(@"HKEY_CURRENT_USER\Software\Mask Data\", "ExcelSSNHash", "Unchecked"));
string _excelCC = Convert.ToString(Registry.GetValue(@"HKEY_CURRENT_USER\Software\Mask Data\", "ExcelCCHash", "Unchecked"));
string _excelWells = Convert.ToString(Registry.GetValue(@"HKEY_CURRENT_USER\Software\Mask Data\", "ExcelWellsHash", "Unchecked"));
string s=@"t\""; //unimportant no-op to placate stackoverflow syntax highlighter.
// Now let's make sure we reflect what they are supposed to be in the GUI.
if (_excelEnable == "Checked")
{
chkbxExcelEnable.Checked = true;
}
else
{
chkbxExcelEnable.Checked = false;
}
if (_excelSSN == "Checked")
{
chkbxExcelSSN.Checked = true;
}
else
{
chkbxExcelSSN.Checked = false;
}
if (_excelCC == "Checked")
{
chkbxExcelCC.Checked = true;
}
else
{
chkbxExcelCC.Checked = false;
}
if (_excelWells == "Checked")
{
chkbxExcelWellsFargo.Checked = true;
}
else
{
chkbxExcelWellsFargo.Checked = false;
}
}
المحلول
حسنًا ، يمكنك على الأقل تضييقها إلى:
chkbxExcelCC.Checked = _excelCC.Equals("Checked");
بهذه الطريقة تجنب كل عبارات if/else.
نصائح أخرى
يمكنك إزالة جميع الشروط غير الضرورية إذا/آخر عن طريق وضع الشرط المضمّن مع المهمة. يمكنك أيضًا جعل مسار المفتاح الرئيسي ثابتًا. ومع ذلك ، لتبسيطه حقًا ، يمكنك أخذ المنطق المتكرر المتمثل في البحث عن مفتاح ومقارنة مع "التحقق" ووضعه في طريقة منفصلة:
private void checkExcelSettings()
{
// Now let's make sure we reflect what they are supposed to be in the GUI.
chkbxExcelEnable.Checked = IsChecked("ExcelEnableHash");
chkbxExcelSSN.Checked = IsChecked("ExcelSSNHash");
chkbxExcelCC.Checked = IsChecked("ExcelCCHash");
chkbxExcelWellsFargo.Checked = IsChecked("ExcelWellsHash");
}
private static bool IsChecked(string regValue)
{
return Convert.ToString(
Registry.GetValue(
@"HKEY_CURRENT_USER\Software\Mask Data\",
regValue,
"Unchecked")) == "Checked";
}
private void checkExcelSettings()
{
// Read what the values are for the checkboxes first and assign them to a string.
string _excelEnable = Convert.ToString(Registry.GetValue(@"HKEY_CURRENT_USER\Software\Mask Data\", "ExcelEnableHash", "Unchecked"));
string _excelSSN = Convert.ToString(Registry.GetValue(@"HKEY_CURRENT_USER\Software\Mask Data\", "ExcelSSNHash", "Unchecked"));
string _excelCC = Convert.ToString(Registry.GetValue(@"HKEY_CURRENT_USER\Software\Mask Data\", "ExcelCCHash", "Unchecked"));
string _excelWells = Convert.ToString(Registry.GetValue(@"HKEY_CURRENT_USER\Software\Mask Data\", "ExcelWellsHash", "Unchecked"));
// Now let's make sure we reflect what they are supposed to be in the GUI.
chkbxExcelEnable.Checked = (_excelEnable == "Checked");
chkbxExcelSSN.Checked = (_excelSSN == "Checked");
chkbxExcelCC.Checked = (_excelCC == "Checked");
chkbxExcelWellsFargo.Checked = (_excelWells == "Checked");
}
يمكنك وضع جميع مربعات الاختيار الخاصة بك على لوحة ، وتعيين خاصية العلامة لكل مربع اختيار على المفتاح المقابل في السجل. ثم يمكنك استخدام هذا الرمز في حدث تحميل النموذج:
foreach (CheckBox cb in panel1.Controls)
{
cb.Checked = ((string)Registry.GetValue(RegPath,
(string)cb.Tag, "Unchecked") == "Checked");
}
هذا له عيب في عدم وضوح على الفور لمبرمج الصيانة المستقبلي ، لذلك أود أن أضيف تعليقًا مطولاً هنا يستهدف بديلك في نهاية المطاف.
يمكنك أيضًا الاستغناء عن العلامة وتسمية كل مربع اختيار بكل ما هو مفتاح المقابل ، ثم استخدام "cb.name" بدلاً من "(سلسلة) cb.tag". لا أحد يحب التدوين المجري بعد الآن ، على أي حال.
private void checkExcelSettings()
{
string key = @"HKEY_CURRENT_USER\Software\Mask Data\";
// Read what the values are for the checkboxes first and assign them to a string.
string _excelEnable = Convert.ToString(Registry.GetValue(key, "ExcelEnableHash", "Unchecked"));
string _excelSSN = Convert.ToString(Registry.GetValue(key, "ExcelSSNHash", "Unchecked"));
string _excelCC = Convert.ToString(Registry.GetValue(key, "ExcelCCHash", "Unchecked"));
string _excelWells = Convert.ToString(Registry.GetValue(key, "ExcelWellsHash", "Unchecked"));
string s=@"t\""; //unimportant no-op to placate stackoverflow syntax highlighter.
// Now let's make sure we reflect what they are supposed to be in the GUI.
chkbxExcelEnable.Checked = (_excelEnable == "Checked");
chkbxExcelSSN.Checked = (_excelSSN == "Checked");
chkbxExcelCC.Checked = (_excelCC == "Checked");
chkbxExcelWellsFargo.Checked = (_excelWells == "Checked");
}
استخدم تدوين اليد القصير لـ IF
chkbxExcelEnable.Checked = _excelEnable == "Checked" ? true: false;