Windows Phone 7 时间表程序
我正在尝试制作一个新的时间表应用程序,用户在其中输入 rowNo 和 colNo 。 到目前为止,我已经完成了这段代码,但是每当我尝试从数组中检索文本框时,都会出现空引用异常。
XAML
<ScrollViewer HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible" Background="{x:Null}">
<Grid Name="bigGrid" Height="780" Width="1300">
<Grid.Background>
<ImageBrush Stretch="Fill" ImageSource="/TimeTableBackground.jpg"/>
</Grid.Background>
<StackPanel Name="panel" Height="128" Margin="0,-3,0,0" VerticalAlignment="Top" Background="#1D000000">
<TextBlock TextWrapping="Wrap" Text="Time Table" FontSize="24" FontStyle="Italic" FontFamily="Segoe WP" FontWeight="Bold" Foreground="#FFC83DA2"/>
<TextBlock TextWrapping="Wrap" Text="Edit Table" Height="72" Padding="0" FontSize="64" FontFamily="Comic Sans MS" FontStyle="Italic" Foreground="#FFFF6BD7"/>
</StackPanel>
<Grid Name="grid1" HorizontalAlignment="Stretch" Height="{Binding ElementName=LayoutRoot,Path=ActualHeight}" Width="5000" VerticalAlignment="Bottom" Background="#1C000000" Margin="-14,0,14,19" ShowGridLines="True" />
</Grid>
</ScrollViewer>
<!--Sample code showing usage of ApplicationBar-->
<phone:PhoneApplicationPage.ApplicationBar>
<shell:ApplicationBar IsVisible="True" IsMenuEnabled="True">
<shell:ApplicationBarIconButton IconUri="/Images/appbar.edit.rest.png" Text="Button 1" Click="ApplicationBarIconButton_Click"/>
<shell:ApplicationBarIconButton IconUri="/Images/appbar.save.rest.png" Text="Button 2"/>
<shell:ApplicationBar.MenuItems>
<shell:ApplicationBarMenuItem Text="MenuItem 1"/>
<shell:ApplicationBarMenuItem Text="MenuItem 2"/>
</shell:ApplicationBar.MenuItems>
</shell:ApplicationBar>
XAML只是为了知道控件的名称。然而,C# 代码就是其中之一。
C#
public partial class Edit_page : PhoneApplicationPage
{
private TextBox[,] tbArray = new TextBox[9,9];
int rowNo = 6, colNo = 6;
public Edit_page()
{
InitializeComponent();
//for loops to add rows and columns to the main grid
for (int j = 0; j <= rowNo; j++)
{
RowDefinition Row = new RowDefinition();
grid1.RowDefinitions.Add(Row);
Row.MinHeight = 80;
}
for (int q = 0; q <= colNo; q++)
{
ColumnDefinition Col = new ColumnDefinition();
grid1.ColumnDefinitions.Add(Col);
Col.MinWidth = 128;
}
grid1.Width = 128 * (colNo);
//for loop to add a text block to each cell.
for (int h = 1; h <= rowNo; h++)
{
tbArray[h, 0] = new TextBox() { TextWrapping = TextWrapping.Wrap, AcceptsReturn = Convert.ToBoolean(1) };
tbArray[h, 0].InputScope = new InputScope { Names = { new InputScopeName { NameValue = InputScopeNameValue.Text } } };
tbArray[h, 0].Background = new SolidColorBrush(Colors.Red);
tbArray[h, 0].SetValue(Grid.RowProperty, h);
tbArray[h, 0].SetValue(Grid.ColumnProperty, 0);
grid1.Children.Add(tbArray[h, 0]);
}
for (int h = 1; h <= colNo; h++)
{
tbArray[0,h] = new TextBox() { TextWrapping = TextWrapping.Wrap, AcceptsReturn = Convert.ToBoolean(1) };
tbArray[0, h].InputScope = new InputScope { Names = { new InputScopeName { NameValue = InputScopeNameValue.Text } } };
tbArray[0, h].Background = new SolidColorBrush(Colors.Red);
tbArray[0, h].SetValue(Grid.RowProperty, 0);
tbArray[0, h].SetValue(Grid.ColumnProperty, h);
grid1.Children.Add(tbArray[0, h]);
}
for (int i = 1; i <= rowNo; i++)
{
for (int k = 1; k <= colNo; k++)
{
tbArray[i, k] = new TextBox() { TextWrapping = TextWrapping.Wrap, AcceptsReturn = Convert.ToBoolean(1) };
tbArray[i, k].InputScope = new InputScope { Names = { new InputScopeName { NameValue = InputScopeNameValue.Text } } };
//name each textbox in the grid
tbArray[i, k].Name = string.Format("tb{0}{1}", i, k);
tbArray[i, k].Text = string.Format("afandem{0}{1}", i, k);
//ScrollViewer scroll = new ScrollViewer();
//scroll.SetValue(Grid.RowProperty, i);
//scroll.SetValue(Grid.ColumnProperty, k);
//scroll.Content = tb;
tbArray[i, k].SetValue(Grid.RowProperty, i);
tbArray[i, k].SetValue(Grid.ColumnProperty, k);
grid1.Children.Add(tbArray[i, k]);
}
}
}
private void ApplicationBarIconButton_Click(object sender, EventArgs e)
{
//var isoStore = IsolatedStorageFile.GetUserStoreForApplication();
////For loops to create files
// for (int i = 0; i <= rowNo; i++)
// {
// for (int j = 0; j <= colNo; j++)
// {
// string fileName = string.Format("{0}{1}.txt", i, j);
// using (var file = isoStore.OpenFile(fileName, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.Write))
// {
// using (var writer = new StreamWriter(file))
// {
// writer.Write(tbArray[i, j].Text);
// }
// }
// }
// }
grid1.Visibility = Visibility.Collapsed;
Grid testGrid = new Grid();
bigGrid.Children.Add(testGrid);
for (int j = 0; j <= rowNo; j++)
{
RowDefinition Row = new RowDefinition();
testGrid.RowDefinitions.Add(Row);
Row.MinHeight = 80;
}
for (int q = 0; q <= colNo; q++)
{
ColumnDefinition Col = new ColumnDefinition();
testGrid.ColumnDefinitions.Add(Col);
Col.MinWidth = 128;
}
testGrid.Width = 128 * (colNo);
for (int i = 0; i <= rowNo; i++)
{
for (int j = 0; j <= colNo; j++)
{
TextBlock tB = new TextBlock();
tB.Text = tbArray[i, j].Text;
tB.SetValue(Grid.RowProperty, i);
tB.SetValue(Grid.ColumnProperty, j);
testGrid.Children.Add(tB);
}
}
}
}
I am trying to make a new Time table app, where the user enters rowNo and colNo.
I have done this code so far, but I get a Null reference exception, whenever I try to retrieve a textbox from the array.
XAML
<ScrollViewer HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible" Background="{x:Null}">
<Grid Name="bigGrid" Height="780" Width="1300">
<Grid.Background>
<ImageBrush Stretch="Fill" ImageSource="/TimeTableBackground.jpg"/>
</Grid.Background>
<StackPanel Name="panel" Height="128" Margin="0,-3,0,0" VerticalAlignment="Top" Background="#1D000000">
<TextBlock TextWrapping="Wrap" Text="Time Table" FontSize="24" FontStyle="Italic" FontFamily="Segoe WP" FontWeight="Bold" Foreground="#FFC83DA2"/>
<TextBlock TextWrapping="Wrap" Text="Edit Table" Height="72" Padding="0" FontSize="64" FontFamily="Comic Sans MS" FontStyle="Italic" Foreground="#FFFF6BD7"/>
</StackPanel>
<Grid Name="grid1" HorizontalAlignment="Stretch" Height="{Binding ElementName=LayoutRoot,Path=ActualHeight}" Width="5000" VerticalAlignment="Bottom" Background="#1C000000" Margin="-14,0,14,19" ShowGridLines="True" />
</Grid>
</ScrollViewer>
<!--Sample code showing usage of ApplicationBar-->
<phone:PhoneApplicationPage.ApplicationBar>
<shell:ApplicationBar IsVisible="True" IsMenuEnabled="True">
<shell:ApplicationBarIconButton IconUri="/Images/appbar.edit.rest.png" Text="Button 1" Click="ApplicationBarIconButton_Click"/>
<shell:ApplicationBarIconButton IconUri="/Images/appbar.save.rest.png" Text="Button 2"/>
<shell:ApplicationBar.MenuItems>
<shell:ApplicationBarMenuItem Text="MenuItem 1"/>
<shell:ApplicationBarMenuItem Text="MenuItem 2"/>
</shell:ApplicationBar.MenuItems>
</shell:ApplicationBar>
XAML is just to know the names of controls. However, C# code is the one.
C#
public partial class Edit_page : PhoneApplicationPage
{
private TextBox[,] tbArray = new TextBox[9,9];
int rowNo = 6, colNo = 6;
public Edit_page()
{
InitializeComponent();
//for loops to add rows and columns to the main grid
for (int j = 0; j <= rowNo; j++)
{
RowDefinition Row = new RowDefinition();
grid1.RowDefinitions.Add(Row);
Row.MinHeight = 80;
}
for (int q = 0; q <= colNo; q++)
{
ColumnDefinition Col = new ColumnDefinition();
grid1.ColumnDefinitions.Add(Col);
Col.MinWidth = 128;
}
grid1.Width = 128 * (colNo);
//for loop to add a text block to each cell.
for (int h = 1; h <= rowNo; h++)
{
tbArray[h, 0] = new TextBox() { TextWrapping = TextWrapping.Wrap, AcceptsReturn = Convert.ToBoolean(1) };
tbArray[h, 0].InputScope = new InputScope { Names = { new InputScopeName { NameValue = InputScopeNameValue.Text } } };
tbArray[h, 0].Background = new SolidColorBrush(Colors.Red);
tbArray[h, 0].SetValue(Grid.RowProperty, h);
tbArray[h, 0].SetValue(Grid.ColumnProperty, 0);
grid1.Children.Add(tbArray[h, 0]);
}
for (int h = 1; h <= colNo; h++)
{
tbArray[0,h] = new TextBox() { TextWrapping = TextWrapping.Wrap, AcceptsReturn = Convert.ToBoolean(1) };
tbArray[0, h].InputScope = new InputScope { Names = { new InputScopeName { NameValue = InputScopeNameValue.Text } } };
tbArray[0, h].Background = new SolidColorBrush(Colors.Red);
tbArray[0, h].SetValue(Grid.RowProperty, 0);
tbArray[0, h].SetValue(Grid.ColumnProperty, h);
grid1.Children.Add(tbArray[0, h]);
}
for (int i = 1; i <= rowNo; i++)
{
for (int k = 1; k <= colNo; k++)
{
tbArray[i, k] = new TextBox() { TextWrapping = TextWrapping.Wrap, AcceptsReturn = Convert.ToBoolean(1) };
tbArray[i, k].InputScope = new InputScope { Names = { new InputScopeName { NameValue = InputScopeNameValue.Text } } };
//name each textbox in the grid
tbArray[i, k].Name = string.Format("tb{0}{1}", i, k);
tbArray[i, k].Text = string.Format("afandem{0}{1}", i, k);
//ScrollViewer scroll = new ScrollViewer();
//scroll.SetValue(Grid.RowProperty, i);
//scroll.SetValue(Grid.ColumnProperty, k);
//scroll.Content = tb;
tbArray[i, k].SetValue(Grid.RowProperty, i);
tbArray[i, k].SetValue(Grid.ColumnProperty, k);
grid1.Children.Add(tbArray[i, k]);
}
}
}
private void ApplicationBarIconButton_Click(object sender, EventArgs e)
{
//var isoStore = IsolatedStorageFile.GetUserStoreForApplication();
////For loops to create files
// for (int i = 0; i <= rowNo; i++)
// {
// for (int j = 0; j <= colNo; j++)
// {
// string fileName = string.Format("{0}{1}.txt", i, j);
// using (var file = isoStore.OpenFile(fileName, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.Write))
// {
// using (var writer = new StreamWriter(file))
// {
// writer.Write(tbArray[i, j].Text);
// }
// }
// }
// }
grid1.Visibility = Visibility.Collapsed;
Grid testGrid = new Grid();
bigGrid.Children.Add(testGrid);
for (int j = 0; j <= rowNo; j++)
{
RowDefinition Row = new RowDefinition();
testGrid.RowDefinitions.Add(Row);
Row.MinHeight = 80;
}
for (int q = 0; q <= colNo; q++)
{
ColumnDefinition Col = new ColumnDefinition();
testGrid.ColumnDefinitions.Add(Col);
Col.MinWidth = 128;
}
testGrid.Width = 128 * (colNo);
for (int i = 0; i <= rowNo; i++)
{
for (int j = 0; j <= colNo; j++)
{
TextBlock tB = new TextBlock();
tB.Text = tbArray[i, j].Text;
tB.SetValue(Grid.RowProperty, i);
tB.SetValue(Grid.ColumnProperty, j);
testGrid.Children.Add(tB);
}
}
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
当您填充
tbArray
时,您将使用以下循环,因为
h
被初始化为1
而不是0
在这两种情况下,tbArray[0,0]
元素都不会被初始化,并且为null
;因此出现 NullReferenceException。我不太确定您的应用程序应该做什么,但可能有一种更好的方法来添加项目,而不是像您一样在代码隐藏中执行所有操作。
例如,如果您尝试在用户单击应用程序栏按钮时添加其他行,那么您应该使用
ListBox
而不是Grid
。然后,ListBox
的ItemTemplate
将包含一个具有 6 列的Grid
(或水平方向的StackPanel
),每个单元格内都有一个TextBlock
。然后,您可以将每个TextBlock
的Text
属性绑定到ObservableCollection
并简单地将新文本添加到所有集合中,这将自动更新 UI 。如果您 Google 一下,可以找到一些关于 XAML 绑定和
ObservableCollection
的教程。另外,除非您在每个TextBlock
中放置很少的文本,否则 6 列对于手机屏幕来说太宽了。When you're populating
tbArray
you're using the following loopsSince
h
is being initialized to1
instead0
in both cases, thetbArray[0,0]
element does not get initialized and isnull
; hence theNullReferenceException
.I'm not really sure what your app is supposed to do but there probably is a better way to go about adding items than doing everything in code-behind as you're doing.
For instance, if you're trying to add additional rows when the user clicks an application bar button, then you should be using a
ListBox
instead of theGrid
. TheItemTemplate
of theListBox
would then contain aGrid
having 6 columns (or aStackPanel
with horizontal orientation), and aTextBlock
within each cell. You can then bind eachTextBlock
'sText
property to anObservableCollection
and simply add new text to all the collections, this will automatically update the UI.There are several tutorials on XAML bindings and
ObservableCollection
s if you Google it. Also, unless you're putting very little text in each of thoseTextBlock
s, 6 columns is going to be too wide for a phone screen.