0

我在 Windows 窗体应用程序中显示了 100 个顺序按钮和复选框,以及保存了一些数字的数据库。

我的目标是根据数据库中保存的数字隐藏按钮和复选框。例如,在我的数据库中,我有 4 个数字:2、4、9 和 10。所以我想隐藏 button2、checkbox2、button4、checkbox4、button9、checkbox9、button10、checkbox10。

这是我尝试过的:

SqlCeCommand cmnd = con.CreateCommand();
cmnd.CommandText = "SELECT * FROM register_db WHERE semester = @s AND department = @d AND course = @c";
cmnd.Parameters.AddWithValue("@s", semester);
cmnd.Parameters.AddWithValue("@d", department);
cmnd.Parameters.AddWithValue("@c", course);

SqlCeDataReader rd = cmnd.ExecuteReader();

while (rd.Read())
{
    string number = rd[0];
    button[number].hide();
    checkbox[number].hide();
    // these are the main things that I didn't know how to do                   
}
4

2 回答 2

1

假设您的控件是这样命名的,您可以通过表单的Controls集合访问它们:

string number = rd[0];
this.Controls["button" + number].Hide();
this.Controls["checkbox" + number].Hide();

但是你真的应该把它们放在一个单独的列表中,并且可能将它们分组到一个StackedPanel或 a中的面板中CheckedListBox

于 2013-09-22T15:17:13.327 回答
0

所有 Windows 窗体控件都有一个.Hide()方法。该代码区分大小写,因此您没有正确调用它。它需要大写:

button[number].Hide();
checkbox[number].Hide();

或者,您可以设置它们的.Visible属性

button[number].Visible = false;
checkbox[number].Visible = false;

或者您在使用控件阵列时遇到问题?在大多数情况下,像button1,button2等名称并不是特别有意义。但是,如果您的控件确实要成为有序控件集合的一部分,您可能只需在表单上创建一个集合来表示它们:

protected IList<Button> Buttons
{
    get
    {
        return new List<Button>
        {
            button1, button2, button3; // etc.
        };
    }
}

否则,访问名称本身中的数值将是一项反思工作,在许多情况下,这并不是您真正想要的方向。建造一个满足你需要的结构比绕过一个不满足的结构要好。

有了这个,您可以将控件作为数组访问:

Buttons[number].Hide();
Checkboxes[number].Hide();

您可以更进一步,将两者结合起来,因为它们是配对的。像这样的东西:

private class ControlGroup
{
    public Button Button { get; set; }
    public CheckBox CheckBox { get; set; }

    public void Hide()
    {
        this.Button.Hide();
        this.CheckBox.Hide();
    }
}

(您可以在该类中添加进一步的错误检查以防止空值等。可能也给该类一个更有意义的名称。)

然后你的收藏变成:

protected IList<ControlGroup> ControlGroups
{
    get
    {
        return new List<ControlGroup>
        {
            new ControlGroup { Button = button1, CheckBox = checkbox1 },
            new ControlGroup { Button = button2, CheckBox = checkbox2 },
            new ControlGroup { Button = button3, CheckBox = checkbox3 }
            // etc.
        };
    }
}

这可以将事物在适当的地方逻辑地组合在一起,形成更智能的数据结构,从而使调用代码更容易:

ControlGroups[number].Hide();
于 2013-09-22T15:12:27.787 回答