Infopath
Formlarında Dinamik Kontroller Yaratma
Bilindiği
üzere InfoPath genişletilebilir
biçimlendirme dili (Extensible Markup Language - XML) temel alır. Kullanıcı InfoPath'de bir formu doldurduğunda,
bu forma ait veriler XML standartlarında kaydedilir .
Örneğin bir
textbox kontrolünün XML yapısı
MainDataSource.CreateNavigator().SelectSingleNode("/my:alanlarım/my:field1",
NamespaceManager).Value;
Infopath formlarında kullanılan kontroller XML yapısını
kullandıkları için nesne olarak değil veri olarak erişebilinirler, dolaysıyla
dinamik olarak aşağıdaki gibi yaratılınamazlar.
TextBox txt = new TextBox();
txt.Name = "txtasdsoyad";
txt.Text = "Güler ONUK";
Ancak Infopath formlarında ihtiyacımız olan kadar dinamik
kontrolleri yaratmayı Repeating Table kullanarak sağlayabiliriz.
Mesela Form yüklenirken 10 tane TextBox kontrolünü dinamik olarak yaratmak istersek yapmamız gereken Repeating Table içine bir TextBox kontrolü eklemek olacaktır.
TextBox kontrolünün adı textyeni
Form
Yüklenirken
public void
FormEvents_Loading(object sender, LoadingEventArgs e)
{
string[]
a = new string[10];
for
(int j = 0; j < 10; j++)
{
a[j] ="Güler ONUK";
string
myNamespace = NamespaceManager.LookupNamespace("my");
using
(XmlWriter writer =
MainDataSource.CreateNavigator().SelectSingleNode(
"/my:alanlarım/my:group1",
NamespaceManager).AppendChild())
{
writer.WriteStartElement("mytable",
myNamespace);
writer.WriteElementString("txtyeni",
myNamespace, a[j]);
writer.WriteEndElement();
writer.Close();
}
}
}
Form
çalıştırıldığın da 10 tane TextBox kontrolü aşağıdaki gibi yaratılmış olunur.
Resimde
görüldüğü gibi form yüklenirken 11 tane TextBox Kontrolü yaratıldı ama 10
tanesinde isim yazıyor.
Bunun sebebi Repeating Table içine
koyduğumuz TextBox kontrolünün boş olmasıdır ve Repeating Table da bu kontrol ilk
satır olur. Bu boş satırın silinmesi için
DeleteFirstRowRepatingTable()
metodu form yüklenirken çağrılır.
private void DeleteFirstRowRepatingTable()
{
XPathNavigator
domNav = MainDataSource.CreateNavigator();
XPathNavigator
itemNav = domNav.SelectSingleNode("/my:alanlarım/my:group1/my:mytable[1]",
NamespaceManager);
// Delete
the row
if
(itemNav != null)
{
itemNav.DeleteSelf();
}
}
Form yüklenirken
public void
FormEvents_Loading(object sender, LoadingEventArgs e)
{
string[]
a = new string[10];
for
(int j = 0; j < 10; j++)
{
a[j] ="Güler ONUK";
string
myNamespace = NamespaceManager.LookupNamespace("my");
using
(XmlWriter writer =
MainDataSource.CreateNavigator().SelectSingleNode(
"/my:alanlarım/my:group1",
NamespaceManager).AppendChild())
{
writer.WriteStartElement("mytable", myNamespace);
writer.WriteElementString("txtyeni",
myNamespace, a[j]);
writer.WriteEndElement();
writer.Close();
}
}
DeleteFirstRowRepatingTable();
}
Diğer
kontrolleri de Repeating Table içinde aynı şekilde yaratabilirsiniz. Hatta
Kontrollerde göstermek isteyeceğiniz verileri bir tablodan alabilirsiniz.
SqlDataAdapter da = new SqlDataAdapter("select*from dbo.BGYSKomisyonUyeleri",
con);
DataTable
dt = new DataTable();
da.Fill(dt);
for (int j = 0; j < dt.Rows.Count; j++)
{
a[j] = dt.Rows[j]["kUserName"].ToString();
string
myNamespace = NamespaceManager.LookupNamespace("my");
using
(XmlWriter writer =
MainDataSource.CreateNavigator().SelectSingleNode(
"/my:alanlarım/my:group1",
NamespaceManager).AppendChild())
{
writer.WriteStartElement("mytable",
myNamespace);
writer.WriteElementString("bgysad",
myNamespace, a[j]);
writer.WriteElementString("bgysonemder", myNamespace, "a1");
writer.WriteEndElement();
writer.Close();
}
}
DeleteFirstRowRepatingTable();
No comments:
Post a Comment