0

C# 和我在不久的将来不会成为最好的朋友,但我正在努力做到最好:D 我想做的是,我想从一些图表中获取一些具有相应值的属性,然后编写它进入一些windows窗体。我虽然大约有一个SplitPanel。在左侧,我想为每个属性添加一个标签,在右侧,为值添加一个文本框。通常我猜标签也会这样做,但在第二步我希望机会通过将新值写入文本框来更改值。但那是遥远的未来,首先我想将这些值放入面板中。获取值没问题,但下一步会给我带来很大的问题。此外,我有两个按钮,一个用于从图表中获取值,一个用于最终提交更改。submitButton 目前没有任何相关性。

![valueChanger.jpg][1]

我猜一个代码告诉了 1000 多个单词,所以这是我到目前为止所做的:

string Attributes;
string Values;
string tag;
tag = "";
Attributes = "";
Values = "";

foreach (EA.Element theElement in myPackage.Elements)
{
  foreach (EA.Attribute theAttribute in theElement.Attributes)
    {
      Attributes = theAttribute.Name.ToString();
      Values = theAttribute.Default.ToString();
      tag = tag + Attributes + Values + Environment.NewLine;
    }

  /*TextWriter writer = new StreamWriter(myPackage.Name.ToString() + ".txt");
  writer.WriteLine(tag.ToString());
  writer.Close();*/
  }

我对文本编写器的部分进行了检查,只是为了检查输出是否正确……是的。

现在是表单的代码隐藏:

public partial class ValueChanger : Form
{
    public ValueChanger()
    {
        InitializeComponent();
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new ValueChanger());   
    }
    public void splitContainer1_Panel1_Paint(object sender,System.Windows.Forms.PaintEventArgs  e)
    {
       Label Alabel = new Label();
       Alabel.Text = Attributes.ToString();
    }

    public void splitContainer1_Panel2_Paint(object sender, PaintEventArgs e)
    {
        TextBox Box = new TextBox();
        Box.Text = Values.ToString();
    }

    /*private void SubmitButton_Click(object sender, EventArgs e)
    {

    }*/

    private void GetButton_Click(object sender, EventArgs e)
    {

    }

对于 GetButton,我尝试了不同的替代方案,但没有任何进展。只是无法访问属性和值。这是我第一次用 C# 对 windows 窗体做任何事情。一般来说,我对 C# 很陌生。我的问题可能是微不足道的,但它让我整个下午都汗流浃背。我不期望代码和所有内容的完整答案。关于提示和提示我会很高兴。

4

3 回答 3

1

您的问题实际上很简单,每个容器(如Panel)都有一个名为 的属性Controls,要将控件显示为容器的子级,您必须将该控件添加到容器中。这是您可能需要的代码的简化版本:

private void AddEntry(string attribute, string value){
   Label lbl = new Label {Text=attribute, Dock=DockStyle.Top};
   lbl.Parent = splitContainer1.Panel1;//This is the same to splitContainer1.Panel1.Controls.Add(lbl);
   lbl.BringToFront();

   TextBox txt = new TextBox {Text=value, Dock=DockStyle.Top};
   txt.Parent = splitContainer1.Panel2;
   txt.BringToFront();
   lbl.Height = txt.Height;
}
//I guess you want to add new entry to your splitContainer in this foreach
foreach (EA.Element theElement in myPackage.Elements)
{
  foreach (EA.Attribute theAttribute in theElement.Attributes)
  {
     Attributes = theAttribute.Name.ToString();
     Values = theAttribute.Default.ToString();
     //call the method above
     AddEntry(Attributes, Values);
     tag = tag + Attributes + Values + Environment.NewLine;
  }
}
于 2013-07-16T16:20:32.807 回答
0

不是一个明确的答案,但我还没有足够的声誉来评论澄清。

我认为您的结构是错误的,您应该在 GetButton_Click 事件中使用一对循环来遍历您从源获取的值,然后将标签/文本框对放入您的 SPlitContainer 中。

绘画事件可以在任何情况下触发,所以不应该在那里做更多的格式化。

如果你是 Winforms 的新手,你不会知道 DataGridView,对于这个确切的场景,你应该学习 :)

于 2013-07-16T16:02:54.120 回答
0

我正在为企业架构师编写一个插件,下面的代码是主类的一部分:

 case "&Change Values":


 string attribute;
 string value;
 attribute = "";
 value = "";

 ChangeValues c = new ChangeValues();

 foreach (EA.Element theElement in myPackage.Elements)
 {
 foreach (EA.Attribute theAttribute in theElement.Attributes)
   {
   attribute = theAttribute.Name.ToString();
   value = theAttribute.Default.ToString();
   c.AddEntry(attribute, value);
   } 
 }

 break;

这是winform的代码:

public ChangeValues()
    {
        InitializeComponent();
        //dataGridView1.Dock = DockStyle.Fill;
        ChangeValues.ActiveForm.Activate();
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new ChangeValues());
        Application.SetCompatibleTextRenderingDefault(false);

    }

public void AddEntry(string attribute, string value)
    {
        Label lbl = new Label { Text = attribute, Dock = DockStyle.Top };
        lbl.Parent = splitContainer1.Panel1;//This is the same to splitContainer1.Panel1.Controls.Add(lbl);
        lbl.BringToFront();

        TextBox txt = new TextBox { Text = value, Dock = DockStyle.Top };
        txt.Parent = splitContainer1.Panel2;
        txt.BringToFront();
        lbl.Height = txt.Height;
    }

private void ChangeValues_Load(object sender, EventArgs e)
    {
    }

当我尝试启动插件时,我得到一个 NullReferenceException。我搜索了一个多小时,但找不到此异常的原因。

于 2013-07-18T15:26:52.780 回答