Brad Abrams отправил что-то связанное только несколько дней назад , http://blogs.msdn.com/brada/archive/2009/02/09/framework-design-guidelines-system-dbnull.aspx
, Таким образом, "Избегает использования Системы. DBNull. Предпочтите Nullable вместо этого".
И вот мои два цента (непротестированного кода :))
// Or if (row["fooColumn"] == DBNull.Value)
if (row.IsNull["fooColumn"])
{
// use a null for strings and a Nullable for value types
// if it is a value type and null is invalid throw a
// InvalidOperationException here with some descriptive text.
// or dont check for null at all and let the cast exception below bubble
value = null;
}
else
{
// do a direct cast here. dont use "as", "convert", "parse" or "tostring"
// as all of these will swallow the case where is the incorect type.
// (Unless it is a string in the DB and really do want to convert it)
value = (string)row["fooColumn"];
}
И один вопрос... Какая-либо причина Вы не используете ORM?
foreach(Control c in this.Controls)
{
if(c is CheckBox)
{
// Do stuff here ;]
}
}
Я использую простой метод расширения, который будет работать для любого типа управления:
public static IEnumerable<T> AllControls<T>(this Control startingPoint) where T : Control
{
bool hit = startingPoint is T;
if (hit)
{
yield return startingPoint as T;
}
foreach (var child in startingPoint.Controls.Cast<Control>())
{
foreach (var item in AllControls<T>(child))
{
yield return item;
}
}
}
Затем , вы можете использовать его так:
var checkboxes = control.AllControls<CheckBox>();
Использование IEnumerable позволяет вам выбирать, как сохранять результаты, а также позволяет использовать linq:
var checkedBoxes = control.AllControls<CheckBox>().Where(c => c.Checked);
Может быть, вот так (если он в Windows Forms ):
foreach(var checkBox in myForm.Controls.OfType<CheckBox>())
{
//Do something.
}
Когда они будут созданы, получите список ссылок на значения, а затем вы можете перебирать список.
Если это Windows Forms , вы можете попробовать что-то вроде этого:
private void button1_Click(object sender, EventArgs e)
{
Dictionary<string, bool> checkBoxes = new Dictionary<string, bool>();
LoopControls(checkBoxes, this.Controls);
}
private void LoopControls(Dictionary<string, bool> checkBoxes, Control.ControlCollection controls)
{
foreach (Control control in controls)
{
if (control is CheckBox)
checkBoxes.Add(control.Name, ((CheckBox) control).Checked);
if (control.Controls.Count > 0)
LoopControls(checkBoxes, control.Controls);
}
}
Помните, что элементы управления контейнера могут содержать дочерние элементы, поэтому вы можете захотеть проверить и их.