gpt4 book ai didi

c# - 执行其他功能时,SheetChange 事件未获取事件 Excel 单元格的更改

转载 作者:行者123 更新时间:2023-12-04 20:07:32 25 4
gpt4 key购买 nike

我正在使用 Visual Studio 中的 c# 编写具有一个窗口窗体的简单应用程序,应用程序 exe 将由 excel VBA 宏打开,应用程序将在启动时读取 activeworkbook.activesheet.cell(1,1) 的值,当发生任何更改时事件表。
该表单具有以下控件:

  • 标签控件名称 (label1)
  • ZEDGraphpan 名称 (zedGraphControl1)

  • 在c#代码中有两个命令
  • 读取Excel();
  • 绘图图();

  • 阅读Excel:更新 label1 文本等于 ActiveWorkbook.ActiveSheet.cell(1,1).value 在启动和事件表中的任何更改事件
    绘图图:在 ZEDGRAPH 中生成多条曲线
    问题:
  • 如果代码只有 Readexcel() 它工作正常并在启动和每次更改事件表时更新 label.text 。
  • 如果代码同时包含 Readexcel() 和 PlotGraph(),则应用程序将仅在启动时更新 label1.text,它不会选择 activesheet 中的任何更改,因此不会实时更新 label1。

  • 问题:如何让 Readexcel() 在同一代码中选择 activesheet 中的实时更改以及 PlotGrah
    该应用程序的代码如下
    using System;
    using System.Drawing;
    using System.Runtime.InteropServices;
    using System.ComponentModel;
    using System.Windows.Forms;
    using ZedGraph;
    using xl = Microsoft.Office.Interop.Excel;


    namespace TestLiveZed
    {
    public partial class GraphForm : Form
    {
    public object ZedGraphcontrol1 { get; private set; }


    public GraphForm()
    {
    InitializeComponent();

    PlotGraph();

    ReadExcel();

    }


    private void OWB_SheetChange(Object Sh, Range Target)
    {
    UpdateText(Target.Value.ToString());
    }

    private delegate void UpdateProgDelegate(String uptxt);
    private void UpdateText(String uptxt)
    {
    if (this.label1.InvokeRequired)
    {
    UpdateProgDelegate updateCallBack = new UpdateProgDelegate(UpdateText);
    this.Invoke(updateCallBack, new object[] { uptxt });
    }
    else
    {
    label1.Text = uptxt.ToString();
    }

    }
    private void ReadExcel()
    {
    xl.Application oXL = (xl.Application)Marshal.GetActiveObject("Excel.Application");
    Workbook oWB;
    Worksheet oSheet;

    oWB = oXL.ActiveWorkbook;
    oSheet = oWB.ActiveSheet;
    oWB.SheetChange += OWB_SheetChange;
    label1.Text = Convert.ToString(oSheet.Cells[1, 1].Value);

    }


    private void PlotGraph()
    {
    GraphPane myPane = zedGraphControl1.GraphPane;
    myPane.Title.Text = "Company A VS B";
    myPane.XAxis.Title.Text = "r/D";
    myPane.YAxis.Title.Text = "K";


    string[] clr = { "Black", "Green", "Blue", "Orange", "Yellow", "Black", "Cyan", "DarkCyan", "Aqua", "Purple", "Pink", "Red", "AliceBlue", "Grey", "DarkGreen" };
    int tr = 0;

    for (int y = 0; y <= 180; y = y+15)
    {

    AddCurv(y,tr, clr);

    tr++;

    }

    }

    private void AddCurv(int y,int tr,string[] clr)
    {
    PointPairList CompAList = new PointPairList();
    for (double i = 0.5; i < 16; i = i + 0.2)
    {
    double f = 0.02;
    int Beta = y;
    double Rratio = i;
    double C = Math.Sin(0.5 * Beta * Math.PI / 180);
    double AL = Beta * Math.PI / 180;
    double r = (Math.Pow(C, 0.5) + C) / Math.Pow(Rratio, 4 * AL / Math.PI);
    double K = f * AL * Rratio + (0.10 + 2.4 * f) * C + (6.6 * f * r);


    CompAList.Add(i, K);
    //CompBList.Add(i + 1, ComBData[i]);

    };
    string vclr = clr[tr];
    _ = zedGraphControl1.GraphPane.AddCurve("Angle = " + y.ToString(), CompAList, Color.FromName(vclr), SymbolType.None);


    zedGraphControl1.GraphPane.YAxis.Scale.Min = 0;
    zedGraphControl1.GraphPane.YAxis.Scale.Max = 1;
    zedGraphControl1.GraphPane.XAxis.Scale.Min = 0;
    zedGraphControl1.GraphPane.XAxis.Scale.Max = 16;
    zedGraphControl1.AxisChange();
    zedGraphControl1.Refresh();

    }
    }
    }

    最佳答案

    最后我设法让它工作
    将表单事件设置为激活和停用
    运行 void Readexcel();

    private void Form1_Activated(object sender, EventArgs e)
    {
    ReadExcel();
    }

    private void Form1_Deactivate(object sender, EventArgs e)
    {
    ReadExcel();
    }

    关于c# - 执行其他功能时,SheetChange 事件未获取事件 Excel 单元格的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72155117/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com