首页 > 解决方案 > 如何在C#中传递参数rowIndex

问题描述

我也是 C# 和 MySQL 的新手。
在我之前关于如何显示包含 SQL 数据的消息框的问题的答案中,他提到了:

调用 Execute 方法时传入参数 rowIndex 和 stringToSearch。

我仍然不明白它是如何工作的。
下面是我的 ViewModel

public class VModel
{
    public ICommand Clicked { get; set; }
    public DataView Library { get; private set; }
    public VModel()
    {
        DataTable dt = new DataTable();
        using (MySqlConnection connection = new MySqlConnection("SERVER=localhost;" + "DATABASE=library;" + "UID=root;" + "PASSWORD=;"))
        {
            MySqlDataAdapter adapter = new MySqlDataAdapter();
            adapter.SelectCommand = new MySqlCommand("Select * from movie_list where id_movie = @id_movie", connection);
            adapter.Fill(dt);

        }

        var Library = dt.DefaultView;
        var Clicked = new ClickedCommand(this);
    }

}

点击

 internal class ClickedCommand : ICommand
{
    private VModel _vModel;
    public ClickedCommand(VModel vModel)
    {
        _vModel = vModel;
    }
    public event EventHandler CanExecuteChanged { add { } remove { } }
    public bool CanExecute(object parameter)
    {
            return true;
    }
    public void Execute(object parameter)
    {
        var rowIndex = (string)parameter[0];
        var stringToSearch = (string)parameter[1];
        MessageBox.Show(_vModel.Library.[rowIndex][stringToSearch]);
    }

}

Xaml

<ScrollViewer>
        <ItemsControl Background="#191919" ItemsSource="{Binding Path=Library}" Margin="130,0,2,0" BorderThickness="0">
            <ItemsControl.ItemTemplate>
            <DataTemplate DataType="viewModels:Card">
                <Button Margin="0,2,0,0" Command="{Binding Path=DataContext.Clicked, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}">
                    <StackPanel Margin="0,0,0,0">
                            <Grid Margin="5,5,5,5">
                                <Rectangle RadiusX="5" RadiusY="5" Width="150" Height="230">
                                    <Rectangle.Fill>
                                        <ImageBrush  x:Name="myImage" ImageSource="{Binding Path=cover}"/>
                                    </Rectangle.Fill>
                                </Rectangle>
                                <Label Background="#CC000000" Margin="107,10,0,193" Content="{Binding Path=year}" HorizontalContentAlignment="right" Foreground="White"/>
                                <Label Width="150" Background="#CC000000" Margin="0,203,0,0" Content="{Binding Path=title}" HorizontalContentAlignment="Center" Foreground="White"/>
                            </Grid>

                        <Label Visibility="Visible"  Name="lbl" HorizontalContentAlignment="Center" Tag="labl"/>
                    </StackPanel>
                </Button>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel Orientation="Horizontal"/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
    </ItemsControl>
    </ScrollViewer>

打开var rowIndex = (string)parameter[0];var stringToSearch = (string)parameter[1];它显示了这一点:

无法将 [] 索引应用于“对象”类型的表达式


当我改变我的时候[rowIndex][0]它说:

无法从“对象”转换为“字符串”

标签: c#mysqlwpfxamlparameter-passing

解决方案


我认为您需要在 DataView 中加载所有电影:

public class VModel
{
    public ICommand Clicked { get; set; }
    public DataView Library { get; private set; }
    public VModel()
    {
        DataTable dt = new DataTable();
        using (MySqlConnection connection = new MySqlConnection("SERVER=localhost;" + "DATABASE=library;" + "UID=root;" + "PASSWORD=;"))
        {
            MySqlDataAdapter adapter = new MySqlDataAdapter();
            adapter.SelectCommand = new MySqlCommand("select * from movie_list", connection);
            adapter.Fill(dt);

        }

        var Library = dt.DefaultView;
        var Clicked = new ClickedCommand(this);
    }
}

当你点击时,你会显示标题:

internal class ClickedCommand : ICommand
{
    private VModel _vModel;
    public ClickedCommand(VModel vModel)
    {
        _vModel = vModel;
    }
    public event EventHandler CanExecuteChanged { add { } remove { } }
    public bool CanExecute(object parameter)
    {
            return true;
    }
    public void Execute(object parameter)
    {
        var id_movie = (int)parameter;
        var rowIndex = id_movie - 1;
        MessageBox.Show(_vModel.Library[rowIndex]["title"].ToString());
    }
}

您可以用"title"表movie_list 的其他列名替换。

此解决方案不使用 Sql 参数。不确定好不好。


推荐阅读