我的程序中的几个地方,必须检查与所选项目匹配的RadioButton,并且我有很多if语句,如下所示:
DataRowView TempRow = (DataRowView)ScheduleDataGrid.SelectedItem;
if (Convert.ToString(TempRow["Bio"]) == "Bio1")
{
BioRB1.IsChecked = true;
}
if (Convert.ToString(TempRow["Bio"]) == "Bio2")
{
BioRB2.IsChecked = true;
}
if (Convert.ToString(TempRow["Bio"]) == "Bio3")
依此类推......我想用简短而聪明的东西取代所有这些。 我尝试使用bio的编号来关联按钮,如下所示:
string bioselected = Convert.ToString(TempRow["Bio"]);
int i = Convert.ToInt16(bioselected.Substring(bioselected.Length - 1, 1));
BioRB[i].IsChecked = true;
但是做BioRB [i]不起作用,它忽略[i]并说BioRB不存在。还有其他建议吗?
答案 0 :(得分:3)
BioRB[i]
没有像你认为的那样做任何事情。所有变量引用(包括控件)都必须在编译时明确定义 - 您不能通过构建与名称匹配的字符串来引用控件的名称。**
尝试创建单选按钮列表。然后你可以索引到列表:
List<RadioButton> radioButtons = new List<RadioButton>()
{
BioRB1,
BioRB2
};
string bioselected = Convert.ToString(TempRow["Bio"]);
int i = Convert.ToInt16(bioselected.Substring(bioselected.Length - 1, 1));
radioButtons[i].IsChecked = true;
**从技术上讲,你可以通过反思来做到这一点,但它比你尝试过的要复杂得多。
答案 1 :(得分:0)
也许这会更好看:
string caseSwitch = Convert.ToString(TempRow["Bio"]);
switch (caseSwitch)
{
case "Bio1":
BioRB1.IsChecked = true;
break;
case "Bio2":
BioRB2.IsChecked = true;
break;
case "Bio3":
BioRB3.IsChecked = true;
break;
default:
Console.WriteLine("Default case...is optional");
break;
}
另外,尝试做Alybaba726所说的并使用CellContentClick或类似的东西:
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
DataGridView dgv = (DataGridView)sender;
if(e.ColumnIndex == dgv.Columns["Bio"].Index)
{
string bioSelected = dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString();
switch (bioSelected)
{
case "Bio1":
BioRB1.IsChecked = true;
break;
case "Bio2":
BioRB2.IsChecked = true;
break;
case "Bio3":
BioRB3.IsChecked = true;
break;
default:
Console.WriteLine("Default case...this is optional");
break;
}
}
}