C# 如何使用一个窗体上的单选按钮来指示另一个窗体上的操作?

C# 如何使用一个窗体上的单选按钮来指示另一个窗体上的操作?,c#,date,radio-button,preferences,C#,Date,Radio Button,Preferences,我有一个应用程序,其中我有一个“首选项”表单,以便允许用户选择他们的首选项。表单有一些单选按钮,允许用户选择他们的首选项。在另一个表单上,我有一些代码,根据选中哪个按钮,它们的反应会有所不同 代码/首选项界面如下所示: private void DateStamp() { if (UserPreferences.Instance.ddmmyyyy.Checked) { int CaretPosition = richTextBoxP

我有一个应用程序,其中我有一个“首选项”表单,以便允许用户选择他们的首选项。表单有一些单选按钮,允许用户选择他们的首选项。在另一个表单上,我有一些代码,根据选中哪个按钮,它们的反应会有所不同

代码/首选项界面如下所示:

private void DateStamp()
    {
        if (UserPreferences.Instance.ddmmyyyy.Checked)
        {
            int CaretPosition = richTextBoxPrintCtrl1.SelectionStart;
            string TextBefore = richTextBoxPrintCtrl1.Text.Substring(0, CaretPosition);
            string textAfter = richTextBoxPrintCtrl1.Text.Substring(CaretPosition);
            string currentDate = DateTime.Now.ToString("dd-MM-yyyy");
            richTextBoxPrintCtrl1.SelectedText = currentDate;
        }
        else if (UserPreferences.Instance.mmddyyyy.Checked)
        {
            int CaretPosition = richTextBoxPrintCtrl1.SelectionStart;
            string TextBefore = richTextBoxPrintCtrl1.Text.Substring(0, CaretPosition);
            string textAfter = richTextBoxPrintCtrl1.Text.Substring(CaretPosition);
            string currentDate = DateTime.Now.ToString("MM-dd-yyyy");
            richTextBoxPrintCtrl1.SelectedText = currentDate;
        }
        else if (UserPreferences.Instance.yyyyddmm.Checked)
        {
            int CaretPosition = richTextBoxPrintCtrl1.SelectionStart;
            string TextBefore = richTextBoxPrintCtrl1.Text.Substring(0, CaretPosition);
            string textAfter = richTextBoxPrintCtrl1.Text.Substring(CaretPosition);
            string currentDate = DateTime.Now.ToString("yyyy-dd-MM");
            richTextBoxPrintCtrl1.SelectedText = currentDate;
        }
        else if (UserPreferences.Instance.yyyymmdd.Checked)
        {
            int CaretPosition = richTextBoxPrintCtrl1.SelectionStart;
            string TextBefore = richTextBoxPrintCtrl1.Text.Substring(0, CaretPosition);
            string textAfter = richTextBoxPrintCtrl1.Text.Substring(CaretPosition);
            string currentDate = DateTime.Now.ToString("yyyy-MM-dd");
            richTextBoxPrintCtrl1.SelectedText = currentDate;
        }
private void button1_Click(object sender, EventArgs e)
    {
        if (ddmmyyyy.Checked)
            DataFormat = ddmmyyyy.Text;
        else if (mmddyyyy.Checked)
            DataFormat = mmddyyyy.Text;
        else if (yyyyddmm.Checked)
            DataFormat = yyyyddmm.Text;
        else if (yyyymmdd.Checked)
            DataFormat = yyyymmdd.Text;
        //--------------------------------------------------
        if (qwerty.Checked)
            KeyboardFormat = qwerty.Text;
        else if (qwertz.Checked)
            KeyboardFormat = qwertz.Text;
        else if (azerty.Checked)
            KeyboardFormat = azerty.Text;
        else if (dvorak.Checked)
            KeyboardFormat = dvorak.Text;
        this.Close();
    }

单选按钮后面没有代码。修饰符是公共的

不过,我遇到的问题是,当我尝试添加“Datestamp”时,我得到一个System.NullReferenceException{“对象引用未设置为对象的实例。”}错误出现在“if(UserPreferences.instance.ddmmyyyy.Checked)”行。我不知道现在该怎么办

因此,当用户添加日期戳时,应该检查单选按钮的选中状态,并添加与选中单选按钮对应的日期戳

提前感谢你的帮助

---编辑---

在“首选项”窗体上,“保存”按钮后面的代码如下:

private void DateStamp()
    {
        if (UserPreferences.Instance.ddmmyyyy.Checked)
        {
            int CaretPosition = richTextBoxPrintCtrl1.SelectionStart;
            string TextBefore = richTextBoxPrintCtrl1.Text.Substring(0, CaretPosition);
            string textAfter = richTextBoxPrintCtrl1.Text.Substring(CaretPosition);
            string currentDate = DateTime.Now.ToString("dd-MM-yyyy");
            richTextBoxPrintCtrl1.SelectedText = currentDate;
        }
        else if (UserPreferences.Instance.mmddyyyy.Checked)
        {
            int CaretPosition = richTextBoxPrintCtrl1.SelectionStart;
            string TextBefore = richTextBoxPrintCtrl1.Text.Substring(0, CaretPosition);
            string textAfter = richTextBoxPrintCtrl1.Text.Substring(CaretPosition);
            string currentDate = DateTime.Now.ToString("MM-dd-yyyy");
            richTextBoxPrintCtrl1.SelectedText = currentDate;
        }
        else if (UserPreferences.Instance.yyyyddmm.Checked)
        {
            int CaretPosition = richTextBoxPrintCtrl1.SelectionStart;
            string TextBefore = richTextBoxPrintCtrl1.Text.Substring(0, CaretPosition);
            string textAfter = richTextBoxPrintCtrl1.Text.Substring(CaretPosition);
            string currentDate = DateTime.Now.ToString("yyyy-dd-MM");
            richTextBoxPrintCtrl1.SelectedText = currentDate;
        }
        else if (UserPreferences.Instance.yyyymmdd.Checked)
        {
            int CaretPosition = richTextBoxPrintCtrl1.SelectionStart;
            string TextBefore = richTextBoxPrintCtrl1.Text.Substring(0, CaretPosition);
            string textAfter = richTextBoxPrintCtrl1.Text.Substring(CaretPosition);
            string currentDate = DateTime.Now.ToString("yyyy-MM-dd");
            richTextBoxPrintCtrl1.SelectedText = currentDate;
        }
private void button1_Click(object sender, EventArgs e)
    {
        if (ddmmyyyy.Checked)
            DataFormat = ddmmyyyy.Text;
        else if (mmddyyyy.Checked)
            DataFormat = mmddyyyy.Text;
        else if (yyyyddmm.Checked)
            DataFormat = yyyyddmm.Text;
        else if (yyyymmdd.Checked)
            DataFormat = yyyymmdd.Text;
        //--------------------------------------------------
        if (qwerty.Checked)
            KeyboardFormat = qwerty.Text;
        else if (qwertz.Checked)
            KeyboardFormat = qwertz.Text;
        else if (azerty.Checked)
            KeyboardFormat = azerty.Text;
        else if (dvorak.Checked)
            KeyboardFormat = dvorak.Text;
        this.Close();
    }
和主要形式字符串:

public partial class Basic_Word_Processor : Form
{
    public string keyboardFormat;
    public string dataFormat;
以及主窗体“ShowDialog”代码:


问题是它没有保存按钮的“选中”状态。对话框一关闭,它就会返回到上一个状态。

我认为通过理解此示例,您可以完成您要做的事情:

我有一个名为
Form1
的主表单,我想在此表单中显示用户选择。 此外,我还添加了一个名为“首选项”(Preferences)的新表单,用户可以选择日期格式和键盘布局:

我的单选按钮命名如下:

RB_D_1
RB_D_2
.
.
.
private void DateStamp()
{
    if (dateFormat.ToUpper() == "DD/MM/YYYY")
    {
        int CaretPosition = richTextBoxPrintCtrl1.SelectionStart;
        string TextBefore = richTextBoxPrintCtrl1.Text.Substring(0, CaretPosition);
        string textAfter = richTextBoxPrintCtrl1.Text.Substring(CaretPosition);
        string currentDate = DateTime.Now.ToString("dd-MM-yyyy");
        richTextBoxPrintCtrl1.SelectedText = currentDate;
    }
    else if (dateFormat.ToUpper() == "MM/DD/YYYY")
    {
        int CaretPosition = richTextBoxPrintCtrl1.SelectionStart;
        string TextBefore = richTextBoxPrintCtrl1.Text.Substring(0, CaretPosition);
        string textAfter = richTextBoxPrintCtrl1.Text.Substring(CaretPosition);
        string currentDate = DateTime.Now.ToString("MM-dd-yyyy");
        richTextBoxPrintCtrl1.SelectedText = currentDate;
    }
    else if (dateFormat.ToUpper() == "YYYY/DD/MM")
    {
        int CaretPosition = richTextBoxPrintCtrl1.SelectionStart;
        string TextBefore = richTextBoxPrintCtrl1.Text.Substring(0, CaretPosition);
        string textAfter = richTextBoxPrintCtrl1.Text.Substring(CaretPosition);
        string currentDate = DateTime.Now.ToString("yyyy-dd-MM");
        richTextBoxPrintCtrl1.SelectedText = currentDate;
    }
    else if (dateFormat.ToUpper() == "YYYY/MM/DD")
    {
        int CaretPosition = richTextBoxPrintCtrl1.SelectionStart;
        string TextBefore = richTextBoxPrintCtrl1.Text.Substring(0, CaretPosition);
        string textAfter = richTextBoxPrintCtrl1.Text.Substring(CaretPosition);
        string currentDate = DateTime.Now.ToString("yyyy-MM-dd");
        richTextBoxPrintCtrl1.SelectedText = currentDate;
    }

}
用户点击
submitchanges
后,我们将检查选中的单选按钮,并将其
Text
属性(例如
RB\u D_1.Text
为“dd/MM/yyyy”)存储到名为
DateFormat
公共字符串变量中

    public string DataFormat, KeyboardFormat;

    private void CMDSubmit_Click(object sender, EventArgs e)
    {
        if (RB_D_1.Checked)
            DataFormat = RB_D_1.Text;
        else if (RB_D_2.Checked)
            DataFormat = RB_D_2.Text;
        else if (RB_D_3.Checked)
            DataFormat = RB_D_3.Text;
        else if (RB_D_4.Checked)
            DataFormat = RB_D_4.Text;
        else
            DataFormat = "MM/DD/YYYY"; // default format

        //--------------------------------

        if (RB_L_1.Checked)
            KeyboardFormat = RB_L_1.Text;
        else if (RB_L_2.Checked)
            KeyboardFormat = RB_L_2.Text;
        else if (RB_L_3.Checked)
            KeyboardFormat = RB_L_3.Text;
        else if (RB_L_4.Checked)
            KeyboardFormat = RB_L_4.Text;
        else
            KeyboardFormat = "QWERTY"; // default format


        this.Close();
    }
现在,我们将用户选择保存在两个字符串变量中,以便从
表单1

Form1
中,每当用户单击
设置
时,我们将从
首选项
表单中创建一个对象,并在关闭首选项表单后将其显示给用户,我们将检查我们已经讨论过的两个字符串变量,并决定如何处理这些结果:

例如,我将这些结果存储到另外两个字符串变量中,并在
textboxs

    private void CMDSettings_Click(object sender, EventArgs e)
    {
        // showing the Preferences form to user 
        Preferences pref = new Preferences();
        pref.ShowDialog();

        // getting results from Preferences Form
        dateFormat = pref.DataFormat;
        keyboardFormat = pref.KeyboardFormat;

        // Showing the Result in TextBoxes
        textBox1.Text = dateFormat ;
        textBox2.Text = keyboardFormat;
    }
更新2:

更改
日期戳()
如下:

RB_D_1
RB_D_2
.
.
.
private void DateStamp()
{
    if (dateFormat.ToUpper() == "DD/MM/YYYY")
    {
        int CaretPosition = richTextBoxPrintCtrl1.SelectionStart;
        string TextBefore = richTextBoxPrintCtrl1.Text.Substring(0, CaretPosition);
        string textAfter = richTextBoxPrintCtrl1.Text.Substring(CaretPosition);
        string currentDate = DateTime.Now.ToString("dd-MM-yyyy");
        richTextBoxPrintCtrl1.SelectedText = currentDate;
    }
    else if (dateFormat.ToUpper() == "MM/DD/YYYY")
    {
        int CaretPosition = richTextBoxPrintCtrl1.SelectionStart;
        string TextBefore = richTextBoxPrintCtrl1.Text.Substring(0, CaretPosition);
        string textAfter = richTextBoxPrintCtrl1.Text.Substring(CaretPosition);
        string currentDate = DateTime.Now.ToString("MM-dd-yyyy");
        richTextBoxPrintCtrl1.SelectedText = currentDate;
    }
    else if (dateFormat.ToUpper() == "YYYY/DD/MM")
    {
        int CaretPosition = richTextBoxPrintCtrl1.SelectionStart;
        string TextBefore = richTextBoxPrintCtrl1.Text.Substring(0, CaretPosition);
        string textAfter = richTextBoxPrintCtrl1.Text.Substring(CaretPosition);
        string currentDate = DateTime.Now.ToString("yyyy-dd-MM");
        richTextBoxPrintCtrl1.SelectedText = currentDate;
    }
    else if (dateFormat.ToUpper() == "YYYY/MM/DD")
    {
        int CaretPosition = richTextBoxPrintCtrl1.SelectionStart;
        string TextBefore = richTextBoxPrintCtrl1.Text.Substring(0, CaretPosition);
        string textAfter = richTextBoxPrintCtrl1.Text.Substring(CaretPosition);
        string currentDate = DateTime.Now.ToString("yyyy-MM-dd");
        richTextBoxPrintCtrl1.SelectedText = currentDate;
    }

}
更新3:

要记住用户选择,请执行以下操作:

将此功能添加到
首选项中

    public void UpdateUserChoice(string date,string keyboard)
    {
        if (date == RB_D_1.Text)
            RB_D_1.Checked = true;
        else if (date == RB_D_2.Text)
            RB_D_2.Checked = true;
        else if (date == RB_D_3.Text)
            RB_D_3.Checked = true;
        else if (date == RB_D_4.Text)
            RB_D_4.Checked = true; 

        //---------------------------

        if (keyboard == RB_L_1.Text)
            RB_L_1.Checked = true;
        else if (keyboard == RB_L_2.Text)
            RB_L_2.Checked = true;
        else if (keyboard == RB_L_3.Text)
            RB_L_3.Checked = true;
        else if (keyboard == RB_L_4.Text)
            RB_L_4.Checked = true; 
    }
并改变向用户显示的旧方式,如下所示:

    private void CMDSettings_Click(object sender, EventArgs e)
    {
        Preferences pref = new Preferences();
        pref.UpdateUserChoice(dateFormat, keyboardFormat);
        pref.ShowDialog();
        dateFormat = pref.DataFormat;
        keyboardFormat = pref.KeyboardFormat;
        textBox2.Text = keyboardFormat;
    } 

谢谢我应该提到的是,“首选项”表单与主表单是分开的。此处显示的代码位于主窗体上,单击按钮时运行。首选项在单独的表单上。我不确定是否理解您的问题,但我在
prefForm
中添加了第一块代码,并在用户单击
main表单的按钮上添加了第二块代码,因此在向用户显示
prefForm
后,我们可以了解用户选择和使用的选项它们在
mainForm
中,这不是你想要的吗?我会尽量解释得更清楚一点(对不起,我最近才开始编程)。我有一个表单(如上图所示),它有偏好选项。在我的主窗体上,有一个“datestamp”选项,当用户单击按钮时,它将日期输入rtb。单选按钮应该控制日期的格式(如代码所示),但我得到的错误是System.NullReferenceException{“对象引用未设置为对象的实例。”}行“if(UserPreferences.instance.ddmmyyyy.Checked)”上的错误。我需要克服这个错误,这样它才能像预期的那样工作。我要让用户检查按钮并保存首选项,这样即使他们关闭并打开表单,检查也保持不变。我会尽快保存检查状态,只要我有这个部分首先工作。没问题,等一下,我会在这里添加一个项目,然后你可以检查它是否为你工作良好。谢谢。唯一的问题是现在它没有保持按钮处于选中状态。不过,它确实有效。我怎么能检查呢?谢谢。我还用你的代码让键盘部分工作。谢谢你今天和我在一起。希望我现在可以通过您的更新解决此问题。:)欢迎您,我的朋友,请选择下面的答案作为您的问题答案,我将非常感激,我真的很高兴我今天能够帮助您,祝您好运:)它现在似乎运行良好。如果还有什么事情发生,我会通过这个问题通知你。非常感谢您今天的帮助。很抱歉,我很痛苦,但是我如何保存检查状态,以便用户重新加载程序时,它会加载程序的设置,这样他们就不必在每次加载程序时都指定它了?