DataGridView可见性
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DataGridView可见性相关的知识,希望对你有一定的参考价值。
我想从一个没有创建DatagridView
的方法访问DatagridView
。我知道一个简单的补救方法是将DatagridView
设置为类变量,但必须有一种方法将DataGridView
从方法传递给方法。
在我的方法btnManipulateGrid_Click()
我得到一个编译错误
名称datagridviewonetwo在当前上下文中不存在
我认为这是由于网格的“范围”,因为我在方法btnDynamicallyAddStuf_Click()
中创建了网格,然后网格只对所述方法可见。
所以我的问题是,除了将网格声明为公共类变量之外,我如何将网格传递给同一类中的其他方法?
private void btnDynamicallyAddStuf_Click(object sender, EventArgs e)
{
Panel pnladdedthroughcode = new Panel();
DataGridView datagridviewonetwo = new DataGridView();
Button xprtToExcel = new Button();
datagridviewonetwo.AllowUserToAddRows = false;
datagridviewonetwo.AllowUserToDeleteRows = false;
datagridviewonetwo.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
datagridviewonetwo.Dock = System.Windows.Forms.DockStyle.Fill;
datagridviewonetwo.Location = new System.Drawing.Point(0, 0);
datagridviewonetwo.Name = "datagridviewonetwo";
datagridviewonetwo.ReadOnly = true;
datagridviewonetwo.Size = new System.Drawing.Size(665, 362);
datagridviewonetwo.TabIndex = 3;
Controls.Add(pnladdedthroughcode);
pnladdedthroughcode.ResumeLayout(false);
pnladdedthroughcode.PerformLayout();
pnladdedthroughcode.Controls.Add(datagridviewonetwo);
pnladdedthroughcode.Location = new System.Drawing.Point(16, 49);
pnladdedthroughcode.Name = "pnladdedthroughcode";
pnladdedthroughcode.Size = new System.Drawing.Size(665, 362);
pnladdedthroughcode.TabIndex = 4;
datagridviewonetwo.DataSource = DataTableCoded;
datagridviewonetwo.AutoResizeColumns();
btnManipulateGrid.Location = new System.Drawing.Point(546, 28);
btnManipulateGrid.Name = "btnManipulateGrid";
btnManipulateGrid.Size = new System.Drawing.Size(122,21);
btnManipulateGrid.TabIndex = 7;
btnManipulateGrid.Text = "Manipulate Data";
btnManipulateGrid.UseVisualStyleBackColor = true;
btnManipulateGrid.Click += new System.EventHandler(btnManipulateGrid_Click);
Controls.Add(btnManipulateGrid);
}
private void btnManipulateGrid_Click(object sender, EventArgs e)
{
//this line gives me the error
var csvString = datagridviewonetwo.ForEachCell(wrapper => EscapeSpecialChars(wrapper, '&', '/')).ChangeRows(RemoveExtraData).ToCsvString();
}
您已手动将网格添加到手动创建的面板,然后您已将面板添加到窗体控件集合。
如果你想避免使用'类级变量'(我没有看到这个决定背后的原因)你应该按照相同的路径恢复网格
Panel pnl = this.Controls.OfType<Panel>();
if(pnl != null)
{
DataGridView grid = pnl.Controls.OfType<DataGridView>();
.... do stuff with the grid
}
当然,只有在表单控件集合中手动添加了面板时,这才有效。如果不是这种情况,您应该使用更精确的方法通过Name属性查找控件
Panel pnl = this.Controls.OfType<Panel>()
.FirstOrDefault(z => z.Name == "pnladdedthroughcode");
if(pnl != null)
.....
最后一点,类级变量不需要设置为public。如果您计划仅在该表单方法中使用该网格,那么您只需将类级别变量声明为私有,并删除从控件层次结构中检索网格的所有代码。
public MyForm: Form
{
// This is visible only inside your form class....
private DataGridView datagridviewonetwo = null;
}
这是因为datagridviewonetwo是一个局部变量。你需要找到控件。尝试是否是asp.net(使用System.Web.UI)
DataGridView myCtl = FindControl("datagridviewonetwo") as DataGridView ;
var csvString = myCtl.ForEachCell(wrapper => EscapeSpecialChars(wrapper, '&', '/')).ChangeRows(RemoveExtraData).ToCsvString();
如果是windows窗体,请尝试
Control[] dgv= this.Controls.Find("datagridviewonetwo", true);
dgv [0]不应该为null,它是一个datagridview。
以上是关于DataGridView可见性的主要内容,如果未能解决你的问题,请参考以下文章