问题 试图通过groupbox获取单选按钮文本

lovekeiiiy

成员
加入
2013年12月29日
消息
12
编程经验
Beginner
我正在努力更好地了解课程。我觉得我在上一个学期的编程课上很好地把握它。因此,我正在使用一个不同的类(Visual Basic)的TextBox,为No-NOLL ASSIGNMES设计加强课程。


无论如何,我有点卡。我尝试在网上进行搜索,只是找不到答案让我陷入驼峰。我也试过询问另一个论坛,没有专门关注C#(Lin),但没有得到回复。任务是创建一些会议登记表。表格设计给出了。还说,使用三层节目设计。检查后有一个复选框,当检查时显示三个会议选择(每个都是课程是相同的费用)。


我所做的是为表单,验证数据和数据库创建类。我想我能做的就是通过GroupBox和它内部的控件(三个单选按钮)。然后我可以检查以确保用户选择一个(传递给验证类),并获取单选按钮文本以写入文本分隔文件(传递到数据库类)。我想,我通过了GroupBox,但这并不让我访问控件。


这是要展示我在做什么的代码。我可能会包含一些额外的不需要的信息。我只是不确定。


我创建了一个类来创建一个对象来保存客户信息。
C#:
namespace NetworkConferenceRegistration
{
    public class ConferenceRegistraction
    {
        //fields
        private int corpID;
        private string firstName;
        private string lastName;
        private int days;
        //private string conferenceName;


[removed code]


        //constructor
       public ConferenceRegistraction(int intCorpID, string strFirstName, string strLastName, int intDays, GroupBox grpCourses)
        {
            corpID = intCorpID;
            firstName = strFirstName;
            lastName = strLastName;
            days = intDays;
            conferenceName = grpCourses.Controls.OfType<RadioButton>;
            
        }

        public ConferenceRegistraction(int intCorpID, string strFirstName, string strLastName, int intDays, RadioButton radCourse)
        {
            corpID = intCorpID;
            firstName = strFirstName;
            lastName = strLastName;
            days = intDays;
            conferenceName = radCourse.Text;
         }

        //properties
        public int CorpID
        {
            get
            {
                return corpID;
            }
            set
            {
                corpID = value;
            }
        }
        public string ConferenceName
        {
            get
            {
                
                return ConferenceName;
            }
        }



[removed code] 
        
        public string ConferenceName //readonly.  don't think i'll need to set which radio button to use or change its text property
        {
            get
            {
                
                return ConferenceName;
            }
        }
                        
        //calculate conferense cost
        public decimal GetCost(CheckBox chkPreconference)
        {
            //local variables
            const decimal decConferenceRatePerDay = 350;    //conference rate per day
            decimal decConferenceCost = 0;                     //total cost of conference


            //calculate the cost based on number of days
            decConferenceCost = decConferenceRatePerDay * Days;
            
            //add preconference cost
            if (chkPreconference.Checked == true)
            {
                decConferenceCost += 675;
            }
            return decConferenceCost;
        }
    }
}


表格
C#:
namespace NetworkConferenceRegistration
{
    public partial class frmNetworkRegistraction : Form
    {
       [code removed]


        //get user information and calculate costs
        private void btnCalculateCosts_Click(object sender, EventArgs e)
        {
            //check to see if user data is valid
            if (txtCorpID.MaskFull & //did user input ID number
                Validation.IsDataEntered(txtFirstName, "First Name", ref strErrorMessage) &   //did user enter first name
                Validation.IsDataEntered(txtLastName, "Last Name", ref strErrorMessage) &    //did user enter last name
                Validation.IsDataEntered(txtNumberOfDays, "Number of Days", ref strErrorMessage) & //did user enter number of days
                Validation.IsDataWithinRange(txtNumberOfDays, 1, 4, "Number of Days", ref strErrorMessage) == true)    //is number of days four or less
            {
                //create object and instantation
                ConferenceRegistraction objNewConferenceRegistraction = new ConferenceRegistraction(Convert.ToInt32(txtCorpID.Text.Trim()), txtFirstName.Text.Trim(), txtLastName.Text.Trim(), Convert.ToInt16(txtNumberOfDays.Text.Trim()));
                lblTotalCosts.Text = objNewConferenceRegistraction.GetCost(chkPreConferenceCourse).ToString();
            }
            else
            {
                MessageBox.Show(strErrorMessage, "Input Error");
                
                //reset error message
                strErrorMessage = string.Empty;
            }
        }
[code removed]


       //change form to display preconferences course selection or not
        private void chkPreConferenceCourse_CheckedChanged(object sender, EventArgs e)
        {
            if (this.grpCourses.Visible == false)
            {
                this.grpCourses.Visible = true;
            }
            else
            {
                this.grpCourses.Visible = false;
            }
        }
    }
}


我曾经工作过,工作数据库类/层,我得到了,stackoverflowException是未处理的错误。我认为这个错误与我的问题联系在于没有关于所选的单选按钮和文本到ConferenceRing类的传递。如果我代码out conferencename行,它可以正常工作。

C#:
namespace NetworkConferenceRegistration{
    public static class Database
    {
        //class level variables
        private static string strDirectory = Application.StartupPath;
        private static string strFileName = "/ConfereenceRegistration.txt";


        public static void Save(ConferenceRegistraction conferenceInformation)
        {
            //create output stream and file
            StreamWriter outputInformation = new StreamWriter(new FileStream(strDirectory + strFileName, FileMode.Create, FileAccess.Write));
            outputInformation.Write(conferenceInformation.CorpID + ",");
            outputInformation.Write(conferenceInformation.FirstName + ",");
            outputInformation.Write(conferenceInformation.LastName + ",");
            outputInformation.Write(conferenceInformation.Days + ",");
            outputInformation.Write(conferenceInformation.ConferenceName + "\n");


            //close file
            outputInformation.Close();
        }
    }
}

任何帮助或建议都将得到欣赏。提前致谢。
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,710
地点
悉尼,澳大利亚
编程经验
10+
在演示层或您的服务(业务逻辑)图层中是否会赋予ConferenceRegistraction类?如果它在中间层中,那么它一定不知道关于演示层和控件的任何内容都是专门演示。如果您有中间层执行验证,则表示层必须以某种形式打包数据,这些形式不依赖于任何特定的演示技术。
 

lovekeiiiy

成员
加入
2013年12月29日
消息
12
编程经验
Beginner
我不确定会议竞技商类的适合,但我认为这将是企业层。我的思想是它创建了一个拥有一个人的注册信息 - ID,名字,姓氏,天数,总成本和(如果适用)预参数课程名称的对象。然后使用该对象传递到要保存的数据库。

我试图将信息设置为在创建对象之前验证信息。我确实创建了一个特定的验证类。它确认名称不是数字,天和ID是整数,并且在可接受的范围内,所有条目字段都有数据。

演示层,特别是表格,我没有设计。它是在任务中给出的。
mockup.jpg. 如果用户检查拍摄前课程,则会出现课程集团框;默认情况下未显示。

鉴于该人可能会在不采取预注点课程的情况下注册,我假设可以创建一个只有空字段或空字符串的对象,因此在保存注册时,它将有一个空白字段在这些情况下逗号分隔文本文件。

不幸的是,我没有有很多例子如何使用三级程序结构。听起来可能有一些误解。关于什么是更好方法的建议?我假设为注册创建一个对象是合适的,但我如何传递信息来获取要赋予ConferenceRing类的信息。

谢谢再次。
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,710
地点
悉尼,澳大利亚
编程经验
10+
设计n层应用程序时的第一件事是,虽然没有必要,但是每个层都可以在不同的物理位置。如果您的服务层位于世界另一端的服务器上给演示层,那么可能性,那么您不想像几个值一样传递像GroupBox一样的复杂对象。通常,您将为每个实体定义一个类,该实体仅包含该实体的数据。然后,您可以在UI上填充该类的实例,并根据需要将其递过层,您可以通过最小数据。您可以在UI进行一些验证,但它始终是在服务层上验证的好表单,因为它可能与不同的演示层或甚至是自动化工具一起使用以在批量中导入数据。
 

lovekeiiiy

成员
加入
2013年12月29日
消息
12
编程经验
Beginner
没有那种在课堂上或我的教科书中讨论过的。所知的第一件事是我可能不应该通过复选框。我在ConferenceRentration类GetCost方法中做过这一点,用于计算注册的成本。由于所有先进课程都是成本,因此我只需要知道是否检查了添加补充修复成本。

因此,可以更好地设置可选参数并提供默认值,例如预注入成本($ 0)和名称(空字符串)。如果是这样,则将在表单类中创建一个变量,以获取该值如果选中复选框,并且选择了哪个单选按钮(或属性值)?
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,710
地点
悉尼,澳大利亚
编程经验
10+
我不确定您的意思是可选参数和默认值。您定义了一个类来表示实体,然后填充从UI中的控件中填充该类的实例的属性。然后,您可以根据需要验证这些属性,例如,字符串不为空,并且该数字处于所需范围。
 

lovekeiiiy

成员
加入
2013年12月29日
消息
12
编程经验
Beginner
对不起,不是我知道更好,但我对Visual Basic的熟悉程度更熟悉。我认为也许有可能,就像设置方法签名一样,创建可选参数,在其中给出一个默认值,当您在调用语句中传递值时,可以更改。我在MSDN网站上发现了此链接: 命名和可选参数(C#编程指南).

我只是找不到或看到从ConferenceReference类中创建统一命名元素的解决方案,因为它没有总是一个值。我认为我需要拥有物业和某种价值(空,空字符串,或者是文字字符串"none selected")由于数据库创建逗号分隔TextFile与注册信息。我假设TextFile将持有几个注册,其中一些将有前提课程和其他人没有。现在,当它尝试保存文件时,我会出现异常,没有预注点课程名称值
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,710
地点
悉尼,澳大利亚
编程经验
10+
现在,当它尝试保存文件时,我会出现异常,没有预注点课程名称值

也许我们可以帮助您解决这个问题,如果我们知道异常是什么以及扔掉它的代码。
 

lovekeiiiy

成员
加入
2013年12月29日
消息
12
编程经验
Beginner
我以为我在我的OP中提到过。我得到的例外是 StackOverFlowException未处理错误。这是数据库类代码。
C#:
[COLOR=#333333]namespace NetworkConferenceRegistration{[/COLOR]
    public static class Database
    {
        //class level variables
        private static string strDirectory = Application.StartupPath;
        private static string strFileName = "/ConfereenceRegistration.txt";


        public static void Save(ConferenceRegistraction conferenceInformation)
        {
            //create output stream and file
            StreamWriter outputInformation = new StreamWriter(new FileStream(strDirectory + strFileName, FileMode.Create, FileAccess.Write));
            outputInformation.Write(conferenceInformation.CorpID + ",");
            outputInformation.Write(conferenceInformation.FirstName + ",");
            outputInformation.Write(conferenceInformation.LastName + ",");
            outputInformation.Write(conferenceInformation.Days + ",");
            [B]outputInformation.Write(conferenceInformation.ConferenceName + "\n");[/B]


            //close file
            outputInformation.Close();
        }
    } [COLOR=#333333]}[/COLOR]

我尝试大胆地旋转Visual Studio检测到错误的行。如果我代码出行,则没有问题。我不记得了如果我试图给它一个字符串,因为这就是会议名称是什么,而且发生了什么。总的来说,它仍然与创建注册课程名称文本元素的注射课程名称文本元素。除此之外,我认为我可能想从写作追加,但对于分配来说,它可能没关系,因为我不知道这个节目如何联系到方案以及文件如何访问或用于检索信息。
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,710
地点
悉尼,澳大利亚
编程经验
10+
如果您有堆栈溢出,那么ConferenceName属性必须是执行最终获得相同属性的代码,而且必须为单位。查看异常的堆栈跟踪,看看正在执行的课程执行,然后您可以确定究竟是什么要做的。
 

lovekeiiiy

成员
加入
2013年12月29日
消息
12
编程经验
Beginner
好吧,我看着堆栈特许道,对我来说并没有对我有很多意义。但是本地值窗口对没有值的错误有一个错误。我更期待这本性的东西,因为我不认为我没有为会议注册对象属性分配一个值。我已经整体了。

我在表单类中添加了一些代码,如果或不是先发事件检查,则它将通过它的文本属性或没有文本(空字符串)来传递单选按钮的文本。

C#:
private void btnCalculateCosts_Click(object sender, EventArgs e)        {
            //check to see if user data is valid
            if (txtCorpID.MaskFull & //did user input ID number.
                Validation.IsDataEntered(txtFirstName, "First Name", ref strErrorMessage) &   //did user enter first name
                Validation.IsDataEntered(txtLastName, "Last Name", ref strErrorMessage) &    //did user enter last name
                Validation.IsDataEntered(txtNumberOfDays, "Number of Days", ref strErrorMessage) & //did user enter number of days
                Validation.IsDataWithinRange(txtNumberOfDays, 1, 4, "Number of Days", ref strErrorMessage) == true)    //is number of days four or less
            {
                string strCourseName = string.Empty;
                if (chkPreConferenceCourse.Checked == true)
                {
                    //foreach (Control button in grpCourses)
                    //{
                    //}
                }
                else
                {
                    //strCourseName = "no precoure taken";
                }


                //create object and instantation
                ConferenceRegistraction objNewConferenceRegistraction = new ConferenceRegistraction(Convert.ToInt32(txtCorpID.Text.Trim()), 
                    txtFirstName.Text.Trim(), txtLastName.Text.Trim(), Convert.ToInt16(txtNumberOfDays.Text.Trim()), strCourseName);
                lblTotalCosts.Text = "Total conference cost is " + objNewConferenceRegistraction.GetCost(chkPreConferenceCourse).ToString("c");


                //save registration information
                Database.Save(objNewConferenceRegistraction);
            }
            else
            {
                MessageBox.Show(strErrorMessage, "Input Error");
                
                //reset error message
                strErrorMessage = string.Empty;
            }
        }

我在找到一个有效的方法来获得哪些有效的方法,如果是在组中选择了单选按钮,并获得它的文本属性,并且真的是先前的。如果选中属性为真,我思考可能是某种觅食循环检查每个单选按钮,然后获取该按钮的文本属性。不幸的是,我如何完成它的构建错误。我做了谷歌搜索,并找到了使用射线组的建议,但我找不到任何解释它是什么或如何使用的东西。
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,710
地点
悉尼,澳大利亚
编程经验
10+
让信息RE的最简单方法是radiobutons是使用LINQ,例如LINQ,例如LINQ。
var selection = this.Controls.OfType<RadioButton>().SingleOrDefault(rb => rb.Checked);

if (selection == null)
{
    MessageBox.Show("No selection has been made.");
}
else
{
    MessageBox.Show(selection.Text + " selected.");
}
转到控件表单的收集,获取radiobutton类型的控件,并获取已选中或唯一的RadioButton,如果没有一个选中,则为NULL。
 

lovekeiiiy

成员
加入
2013年12月29日
消息
12
编程经验
Beginner
谢谢回复。我只听说过Linq,但没有介绍过我所学到的任何东西。我试着在阅读它 MSDN. 网站,但并没有真正能够跟上解释。虽然,它会出现我过去的某种形式使用它。

无论如何,我尝试过代码,但没有工作100%。它没有检测到任何选定的单选按钮。并对我的感叹号做,我无法调试它。所以,我的工作效率效率越来越高,并努力工作。
C#:
string strCourseName = string.Empty;                if (chkPreConferenceCourse.Checked == true)
                {
                    if (radMovingBitsBytesCourse.Checked == true)
                    {
                        strCourseName = radMovingBitsBytesCourse.Text;
                    }
                    else if (radNetworkSecurityCourse.Checked == true)
                    {
                        strCourseName = radNetworkSecurityCourse.Text;
                    }
                    else if (radWANCourse.Checked == true)
                    {
                        strCourseName = radWANCourse.Text;
                    }
                    else
                    {
                        MessageBox.Show("No precourse was selected", "Input Error");
                    }
                }

有一个逻辑错误,但它比代码更多。如果没有选择课程,因此我不应该创建统一事项对象,因为它具有无效数据。我可以默认选择课程;可能是最简单的修复。另一个选项可以是在表单中创建一种方法,并在检索单选按钮文本语句后调用它。我不喜欢这一点,因为我将重复三次相同的线。
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,710
地点
悉尼,澳大利亚
编程经验
10+
最有可能的Linq不起作用,因为您刚从我的示例中直接使用了代码。该示例使用控件的表单集合,但如果我记得,您的radiobuton是集团盒的儿童,而不是形式本身。
 

lovekeiiiy

成员
加入
2013年12月29日
消息
12
编程经验
Beginner
是的,我复制了您给出的代码。是的,单选按钮在GroupBox中。

我必须遇到一个问题,发现并修复了ConferenceName属性。我返回了ConferenceName字段。谢谢你仍然指向它。
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,710
地点
悉尼,澳大利亚
编程经验
10+
是的,我复制了您给出的代码。是的,单选按钮在GroupBox中。

我必须遇到一个问题,发现并修复了ConferenceName属性。我返回了ConferenceName字段。谢谢你仍然指向它。

经常说依靠单独的案例来区分挡境剂是糟糕的做法。我也在vb中代码很多,因此不区分大小写,因此我通常为返回带有下划线的属性的字段前缀,这对于VB开发人员来说并不罕见。为了清楚起见,我在C#中使用相同的惯例。
 

lovekeiiiy

成员
加入
2013年12月29日
消息
12
编程经验
Beginner
同意。我绝对喜欢,更喜欢,使用前缀。它使得它更容易了解该变量是什么以及如何使用它。我也开始学习VB(我记得在VBForums中看到你的头像名称)。

我还在学习,所以我必然会产生一些或更多的错误。希望我能从他们那里学习。
 
最佳 底部