Как найти проверенную радиокнопку, используя имя группы Мой код прикреплен?

я пытаюсь найти значение проверенного радио, используя имя группы, у меня есть метод, который возвращает его, но что я должен передать в этом методе вместе с именем группы

метод здесь,

private string getRadioValue(ControlCollection clts, string groupName)
{
    string ret = "";
    foreach (Control ctl in clts)
    {
        if (ctl.Controls.Count != 0)
        {
            if (ret == "")
                ret = getRadioValue(ctl.Controls, groupName);
        }

        if (ctl.ToString() == "System.Web.UI.WebControls.RadioButton")
        {
            RadioButton rb = (RadioButton)ctl;
            if (rb.GroupName == groupName && rb.Checked == true)
                ret = rb.Attributes["Value"];
        }
    }
    return ret;
}

я использую это как

Oc.aProjectSubmited = getRadioValue(RadioButton,"Aps");

где Aps - это радиогруппа, но я получаю сообщение об ошибке «неверный аргумент» на переключателе, который я передаю ??

надеюсь на ваше предложение заранее спасибо


person tester Joe    schedule 30.05.2013    source источник


Ответы (4)


Это потому, что вы проходите RadioButton. Ваш метод принимает ControlCollection, а не Control.

Почему бы не передать this.Controls, чтобы передать всю ControlCollection страницы? Или любую другую коллекцию ControlCollection, которую вы можете использовать для хранения той RadioButton, которую хотите проверить?

Вот пример:

    protected void Page_Load(object sender, EventArgs e)
    {
        getRadioValue(this.Controls, "Hello");
    }

    private string getRadioValue(ControlCollection clts, string groupName)
    {
        string ret = "";
        foreach (Control ctl in clts)
        {
            if (ctl.Controls.Count != 0)
            {
                if (ret == "")
                    ret = getRadioValue(ctl.Controls, groupName);
            }

            if (ctl.ToString() == "System.Web.UI.WebControls.RadioButton")
            {
                RadioButton rb = (RadioButton)ctl;
                if (rb.GroupName == groupName && rb.Checked == true)
                    ret = rb.Attributes["Value"];
            }
        }
        return ret;
    }
person aiapatag    schedule 30.05.2013

Вот более короткая версия с использованием Linq, чтобы избежать циклов...

public static string GetRadioValue(ControlCollection controls, string groupName)
{
   var selectedRadioButton = controls.OfType<RadioButton>().FirstOrDefault(rb => rb.GroupName == groupName && rb.Checked);
   return selectedRadioButton == null ? string.Empty : selectedRadioButton.Attributes["Value"];
}
person wloescher    schedule 22.05.2015
comment
Только что нашел аналогичный ответ от SLaks на аналогичный вопрос... stackoverflow.com/questions/1797907/ - person wloescher; 22.05.2015
comment
Аналогичный ответ, упомянутый выше, относится к WinForms - это вопрос WebForms. - person track0; 06.10.2016

Используйте LINQ:

container.Controls.OfType<RadioButton>().FirstOrDefault(r => r.GroupName == "GroupName" && r.Checked).Text;
person Adi S    schedule 27.03.2017

ToString() не даст вам того, что вы хотите: вам нужно что-то вроде

private string getRadioValue(ControlCollection clts, string groupName)
{
    var ret = "";
    foreach (Control ctl in clts)
    {
        if (ctl.Controls.Count != 0)
        {
            ret = getRadioValue(ctl.Controls, groupName);
        }
        if (!string.IsNullOrEmpty(ret)) {
          return ret;
        }
        var rb = ctl as RadioButton;
        if (rb != null && rb.GroupName == groupName && rb.Checked)
                return = rb.Attributes["Value"];
        }
    }
    return ret;
}
person Bob Vale    schedule 30.05.2013
comment
ну, ToString() по-прежнему будет работать, хотя это и не лучшая практика. Хотя я не думаю, что это ответ. - person aiapatag; 30.05.2013
comment
@Bob, что я должен передать для ControlCollection clts? - person tester Joe; 30.05.2013
comment
@aiapatag Хорошо, я не проверял, что RadioButton.ToString() выводит имя класса, однако, если использовался унаследованный элемент управления, который использовал другую реализацию ToString, мой ответ все равно работал бы - person Bob Vale; 30.05.2013
comment
@BobVale да, действительно. Но я хочу сказать... это не ответ на вопрос автора. - person aiapatag; 30.05.2013
comment
@testerJoe Предположение, что атрибут значения для найденного переключателя имеет значение null или не установлен. - person Bob Vale; 30.05.2013
comment
если я хочу получить идентификатор радио, я бы заменил [Value] на [Id]? - person tester Joe; 30.05.2013
comment
@testerJoe либо rb.ID, если вам нужен идентификатор на стороне сервера, либо rb.ClientID, если вам нужен идентификатор на стороне клиента. - person Bob Vale; 30.05.2013
comment
@BOb я сделал то же самое Спасибо - person tester Joe; 31.05.2013